Опис програми та даних 8 Тестування 9 Список літератури 10 Додаток (роздрук програми) 11
Вид материала | Документы |
- Програми для вступних іспитів у формі тестування. Українська мова та література, 254.76kb.
- Формулювання вимог до програми 7 2 Проектування програми 7 3 Кодування програми, 390.59kb.
- Опис програми кредитного модуля нп-07 Постреляційні бази даних, 77.22kb.
- Начальникам управління освіти Чернівецької міської ради, Кельменецької райдержадміністрації,, 28.24kb.
- Опис кредитного модуля (дисципліни), 76.4kb.
- Доповідь про виконання програми «подолання епідемії віл/снід в україні», підтриманої, 314.02kb.
- Розділ лінійні програми вступ поняття програми. Мова програмування середовище програмування., 1210.78kb.
- Програми фахових вступних випробувань; Вимог до рівня підготовки вступників; Переліку, 116.7kb.
- Розробка рекламної програми 34 >11. Бюджет реалізації маркетингової програми 36 Список, 414.83kb.
- Інтерфейс системи керування базами даних access. Створення бази даних. Таблиці. Запити, 156.05kb.
МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ
ДНІПРОПЕТРОВСЬКИЙ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ ім. О.Гончара
КАФЕДРА МАТЕМАТИЧНОГО ЗАБЕЗПЕЧЕННЯ ЕОМ
МОДУЛЬНА РОБОТА
з дисципліни
“Системне програмування та операційні системи”
Виконав: студент гр. ПЗ-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 в свій власний внутрішній формат переміщуваних модулів. Це перетворення можливе лише при дотриманні деяких правил:
- Всі процедури і функції повинні бути поміщені в сегмент з ім'ям CODЕ або CSEG, або в сегмент, ім'я якого закінчується на _TEXT. Всі приватні змінні, що ініціалізували, повинні бути переміщені в сегмент з іменем Const або в сегмент, ім'я якого закінчується на _DATA. Все неініціалізовані приватні змінні повинні бути поміщені в сегмент, ім'я якого закінчується на _DAТA. Неініціалізовані локальні змінні повинні поміщатися в сегмент з іменем DATA або DSEG, або в сегмент, ім'я котрого закінчується на _BSS. Всі інші сегменти ігноруються, тому є директива GRОUР. У визначеннях сегменту може задаватися вирівнювання на границю слова або байта (WORD або ВYTE). При компоновці вони завжди вирівнюються на границю слова. У визначеннях сегментів можуть вказуватися директиви PUВLIС і ім'я класу (вони ігноруються).
- Borland Pascal ігнорує всі дані для сегментів, від особистих від сегменту коду (CODE, CSEG або xxxx_TEXT) і сегменту даних, що є ініціалізованими (CONST або xxxx_DATA). Тому при описі змінних в сегменті неініціалізованих даних (DAТA, DSEG або xxxx_BSS) для визначення значення завжди використовуйте знак питання(?). Наприклад:
Count DW ?
Buffer DB 128 DUP(?)
- Байтові посилання на ідентифікатори типу 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 – повідомлення для користувача
Тестування
Список літератури
- Конспект лекцій з курсу «Системне програмування та ОС»
- Владислав Пирогов. Ассемблер для Windows. — СПб.: БХВ-Петербург, 2007. — 896 с.
- Калашников О. А. Ассемблер? Это просто! Учимся программировать. — СПб.: БХВ-Петербург, 2007. — 384 с.
- Зубков С. В. Ассемблер для DOS, Windows и UNIX.
- Руководство по языку 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