Опис програми та даних 8 Тестування 9 Список літератури 10 Додаток (роздрук програми) 11

Вид материалаДокументы

Содержание


Постановка задачі
Теоретична частина
Турбо Асемблер і Borland Pascal
MODEL xxxx, PASCAL
Методи на мові асемблера
Алгоритмічна частина
Головний модуль
Опис програми та даних
Список літератури
Додаток (роздрук програми)
Extrn aa281:far
Подобный материал:

МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ

ДНІПРОПЕТРОВСЬКИЙ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ ім. О.Гончара

КАФЕДРА МАТЕМАТИЧНОГО ЗАБЕЗПЕЧЕННЯ ЕОМ


МОДУЛЬНА РОБОТА

з дисципліни

“Системне програмування та операційні системи”


Виконав: студент гр. ПЗ-07-1

Журба Д.С.

Перевірив:

ст. викл. Сегеда Н.Є.


Дніпропетровськ

2009

Зміст


Постановка задачі 3

Теоретична частина 4

Алгоритмічна частина 7

Опис програми та даних 8

Тестування 9

Список літератури 10

Додаток (роздрук програми) 11



Постановка задачі


Завдання: Створення багатомодульної програми, в якій виконується підключення модулів на мові Assembler до програми на мові високого рівня.

Програма повинна виводити протокол викликів з відображенням переданих, прийнятих та повернених значень.

Індивідуальний варіант №28: Реалізувати програму заданої структури:


Теоретична частина



Компоновка з програмами на мові асемблера

За допомогою директиви компілятора $L можна виконати компоновку програм або модулів на мові Паскаль та процедур і функцій на мові асемблера. З початкового файлу на мові асемблера можна за допомогою асемблера отримати об'єктний файл (з розширенням .OBJ). Використовуючи компонувальник, декілька об'єктних файлів можна скомпонувати з програмою або модулем. При цьому використовується директива компілятора $L. В програмі або модулі на мові Паскаль процедури або функції, написані на мові асемблера, повинні бути описані як зовнішні. Наприклад:

function LoCase(Ch : Char): Char; external;

У відповідному файлі на мові асемблера всі процедури або функції повинні знаходитися в сегменті з іменем CОDЕ або CSEG, або в сегменті, ім'я якого закінчується на _TEXT, а імена зовнішніх процедур і функцій повинні бути вказані в директивах PUВLIC. Ви повинні забезпечити відповідність процедури або функції її визначенню в Паскалі. Це відноситься до типу її виклику (ближній або дальній), числу і типу параметрів і типу результату.

В початковому файлі на мові асемблера можуть описуватися ініціалізовані змінні, що містяться в сегменті з іменем CONST або в сегменті, що закінчується на _DAТA, і неініціалізовані змінні в сегменті з іменем DATA або DSEG, або в сегменті, ім'я якого закінчується на _BSS. В початковому файлі на мові асемблера ці змінні є приватними, і на них не можна посилатися з модуля або програми на Паскалі. Вони, проте, знаходятся в тому ж сегменті, що і глобальні змінні Паскаля, і доступні через регістр сегменту DS.

На всі процедури, функції і змінні, описані в модулі або програмі на Паскалі і на ті з них, які описані в інтерфейсній секції модулів, що використовуються, можна посилатися з початкового файлу на мові асемблера за допомогою директиви EXTRN. При цьому обов'язок забезпечити коректний тип у визначенні EXTRN також покладається на вас.

Коли об'єктний файл вказується в директиві $L, Borland Pascal перетворить файл з формату переміщуваних об'єктних модулів (.OBJ) фірми Intel в свій власний внутрішній формат переміщуваних модулів. Це перетворення можливе лише при дотриманні деяких правил:
  1. Всі процедури і функції повинні бути поміщені в сегмент з ім'ям CODЕ або CSEG, або в сегмент, ім'я якого закінчується на _TEXT. Всі приватні змінні, що ініціалізували, повинні бути переміщені в сегмент з іменем Const або в сегмент, ім'я якого закінчується на _DATA. Все неініціалізовані приватні змінні повинні бути поміщені в сегмент, ім'я якого закінчується на _DAТA. Неініціалізовані локальні змінні повинні поміщатися в сегмент з іменем DATA або DSEG, або в сегмент, ім'я котрого закінчується на _BSS. Всі інші сегменти ігноруються, тому є директива GRОUР. У визначеннях сегменту може задаватися вирівнювання на границю слова або байта (WORD або ВYTE). При компоновці вони завжди вирівнюються на границю слова. У визначеннях сегментів можуть вказуватися директиви PUВLIС і ім'я класу (вони ігноруються).
  2. Borland Pascal ігнорує всі дані для сегментів, від особистих від сегменту коду (CODE, CSEG або xxxx_TEXT) і сегменту даних, що є ініціалізованими (CONST або xxxx_DATA). Тому при описі змінних в сегменті неініціалізованих даних (DAТA, DSEG або xxxx_BSS) для визначення значення завжди використовуйте знак питання(?). Наприклад:

Count DW ?

Buffer DB 128 DUP(?)
  1. Байтові посилання на ідентифікатори типу EXTRN неприпустимі. Це означає, наприклад, що оператори НIGНТ і LОW не можна використовувати з ідентифікаторами типу EXTRN.

Турбо Асемблер і Borland Pascal

Турбо Асемблер (TASM) значно полегшує розробку програм на мові асемблера і організації в них інтерфейсу з програмами Borland Pascal. Турбо Асемблер підтримує специфічне використання сегментів, схему пам'яті і мовну підтримку для програмістів, що працюють на Borland Pascal.

Використовуючи ключове слово PASCAL і директиву .MODEL, можна забезпечити дотримання угод про виклики з Borland Pascal, визначити імена сегментів, виконати інструкції PUSH BP і MOV PB,SP, а також забезпечити повернення управління за допомогою операторів POP BP і RET N (де N - це число байт параметра). Директива .MODEL має наступний синтаксис:

.MODEL xxxx, PASCAL

де xxxx - це модель пам'яті (звичайно LARGE).

Завдання в директиві .MODEL мови PASCAL повідомляє Турбо Асемблеру, що параметри були занесені в стек зліва-направо - в тому порядку, в якому вони знайдені в початковому операторі, що викликає процедуру. Директива PROC дозволяє вам задати параметри в тому ж порядку, як вони визначені в програмі Borland Pascal. Якщо ви визначаєте функцію, яка повертає рядок, зверніть увагу на те, що директива PROC має опцію RETURNS, що дозволяє вам отримати доступ до тимчасового покажчика рядка в стеку і не впливає на число байт параметра, що додаються в операторі RET.

Методи на мові асемблера

Методи, реалізовані на мові асемблера, можна скомпонувати з програмами Borland Pascal за допомогою директиви компілятора $L і зарезервованого ключового слова external. Опис зовнішнього методу в об'єктному типі не відрізняється від звичайного методу; проте в реалізації методу перераховується тільки заголовок методу, за яким слідує зарезервоване слово external. В початковому тексті на асемблері замість крапки (.) для запису уточнених ідентифікаторів слід використовувати операцію @ (крапка в асемблері вже має інший сенс і не може бути частиною ідентифікатора).

Наприклад, ідентифікатор Паскаля Rect.Init записується на ассемблері як Rest@Init. Синтаксис @ можна використовувати як в ідентифікаторах PUBLIC, так і EXTRN.

Алгоритмічна частина



Головний модуль на Паскалі

Ввести

Ввести

Викликати модуль PA281 з параметрами k,AA281

Викликати модуль PA281 з параметрами l,AA282

Головний модуль PA281

Отримати адреси параметрів зі стеку

Отримати параметри за їх адресами

Вивести <параметр1>

Викликати <параметр2> з параметром-символом

Отримати змінений параметр

Вивести змінений параметр

Модуль AA281

Отримати адреси параметрів зі стеку

Отримати параметри за їх адресами

Вивести <параметр1>

Перевести параметр-символ у верхній регістр

Записати змінений параметр за отриманою адресою

Модуль AA282

Отримати адреси параметрів зі стеку

Отримати параметри за їх адресами

Вивести <параметр1>

Перевести параметр-символ у нижній регістр

Записати змінений параметр за отриманою адресою

Опис програми та даних



При запуску програми користувач повинен ввести початкові значення – змінні k та l.

Дана програма виводить протокол викликів процедур на мові асемблера з паскаля із виведенням переданих, отриманих та змінених значень параметрів процедур.

Програма містить наступні дані:

Модуль на паскалі:

k , l – параметри для передачі процедурі PA281

Модуль PA281:

msgmod1, msgmod11, msgmod12, msgmod13 – повідомлення для користувача

c db 'b' – параметр для передачі процедурам, що викликаються

Модуль AA281:

Msgmod2, msgmod21, msgmod22 – повідомлення для користувача

Модуль AA282:

Msgmod2, msgmod21, msgmod22 – повідомлення для користувача

Тестування








Список літератури




  1. Конспект лекцій з курсу «Системне програмування та ОС»
  2. Владислав Пирогов. Ассемблер для Windows. — СПб.: БХВ-Петербург, 2007. — 896 с.
  3. Калашников О. А. Ассемблер? Это просто! Учимся программировать. — СПб.: БХВ-Петербург, 2007. — 384 с.
  4. Зубков С. В. Ассемблер для DOS, Windows и UNIX.
  5. Руководство по языку B.Pascal 7 & Objects/LR (amursu.ru/programming/bp70_lr/index.shtml)

Додаток (роздрук програми)


Головний модуль на Паскалі

program lab3;

{$F+}

{$L D:\tpascal.71\bin\dzhurba\lab3asm\mod1.obj}

{$L D:\tpascal.71\bin\dzhurba\lab3asm\mod2.obj}

{$L D:\tpascal.71\bin\dzhurba\lab3asm\mod3.obj}

uses crt;

type proctype=procedure(var c:char);

var k,l:integer;

procedure PA281(P1:integer;P2:proctype);external;

procedure AA281(var c:char);external;

procedure AA282(var c:char);external;

begin

clrscr;

write('Vvedite k:');

readln(k);

write('Vvedite l:');

readln(l);

writeln('Zapuskaem PA281, parametri: k=',k,', procedura=AA281.');

PA281(k,AA281);

writeln('Zapuskaem PA281, parametri: l=',l,', procedura=AA282.');

PA281(l,AA282);

readln;

end.

Головний модуль PA281

.286

EXTRN AA281:FAR

EXTRN AA282:FAR

code segment 'code'

public PA281

msgmod1 db 'Hello! I am PA281!',10,13,'$'

msgmod11 db 'This is our parameter:','$'

msgmod12 db 'I will send you symbol:','$'

msgmod13 db 'They... answered! We received such message:','$'

c db 'b'

PA281 proc far p1:word,p2:dword

assume cs:code

push bp

mov bp,sp

push ds

mov ax,cs

mov ds,ax

mov ah,9

lea dx,msgmod1

int 21h

mov ah,9

lea dx,msgmod11

int 21h

mov ax,[bp+10]

mov cx,0

cmp ax,0

jge m1

mov dl,'-'

mov bx,ax

mov ah,2

int 21h

mov ax,bx

mov bx,-1

imul bx

m1:mov bl,10

idiv bl

mov bx,ax

push bx

inc cx

xor ah,ah

cmp al,0

jg m1

m2:pop ax

add ah,30h

mov dl,ah

mov ah,2

int 21h

loop m2

mov dl,10

mov ah,2

int 21h

mov dl,13

mov ah,2

int 21h

mov ah,9

lea dx,msgmod12

int 21h

mov dl,c

mov ah,2

int 21h

mov dl,10

mov ah,2

int 21h

mov dl,13

mov ah,2

int 21h

pop ds

push ds

push offset c

CALL dword ptr[bp+6]

push ds

mov ax,cs

mov ds,ax

mov ah,9

lea dx,msgmod13

int 21h

mov dl,c

mov ah,2

int 21h

mov dl,10

mov ah,2

int 21h

mov dl,13

mov ah,2

int 21h

pop ds

pop bp

ret 6

PA281 endp

code ends

end

Модуль AA281

.286

cseg segment 'code'

public AA281

msgmod2 db 'Hello! I am AA281!',10,13,'$'

msgmod21 db 'This is your parameter:','$'

msgmod22 db 'This is our parameter:','$'

AA281 proc far c:byte

assume cs:cseg

push bp

mov bp,sp

push ds

mov ax,cs

mov ds,ax

mov ah,9

lea dx,msgmod2

int 21h

mov ah,9

lea dx,msgmod21

int 21h

mov bx,[bp+6]

mov dl,[bx]

mov ah,2

int 21h

mov dl,10

mov ah,2

int 21h

mov dl,13

mov ah,2

int 21h

mov ah,9

lea dx,msgmod22

int 21h

mov ah,2

mov dl,[bx]

sub dl,20h

mov [bx],dl

int 21h

mov dl,10

mov ah,2

int 21h

mov dl,13

mov ah,2

int 21h

pop ds

pop bp

ret 4

AA281 endp

cseg ends

end

Модуль AA282

.286

cseg segment 'code'

public AA282

msgmod2 db 'Hello! I am AA282!',10,13,'$'

msgmod21 db 'This is your parameter:','$'

msgmod22 db 'This is our parameter:','$'

AA282 proc far c:byte

assume cs:cseg

push bp

mov bp,sp

push ds

mov ax,cs

mov ds,ax

mov ah,9

lea dx,msgmod2

int 21h

mov ah,9

lea dx,msgmod21

int 21h

mov bx,[bp+6]

mov dl,[bx]

mov ah,2

int 21h

mov dl,10

mov ah,2

int 21h

mov dl,13

mov ah,2

int 21h

mov ah,9

lea dx,msgmod22

int 21h

mov ah,2

mov dl,[bx]

add dl,20h

mov [bx],dl

int 21h

mov dl,10

mov ah,2

int 21h

mov dl,13

mov ah,2

int 21h

pop ds

pop bp

ret 4

AA282 endp

cseg ends

end