Міністерство освіти і науки України
Національний технічний університет України
«Київський політехнічний інститут імені Ігоря Сікорського»
Теплоенергетичний факультет
Кафедра автоматизації проектування енергетичних процесів і систем
Звіт
до лабораторної роботи №8
з дисципліни «Операційні системи»
Тема « Макрозасоби мови Асемблер »
Варіант 3
Мета роботи: Вивчення макросів, макрокоманд та макророзширень та їх застосування в асемблерних програмах.
Теоретичні відомості
Обробка програми на асемблері з використанням макрозасобів неявно здійснюється транслятором у дві фази:
/
Макрозасоби Асемблера IBM PC мають три складові:
1. Макровизначення (макрос) – набір команд, який містить опис якоїсь дії або алгоритму. Макрос повинен знаходитися на початку програми, до визначення сегментів.
2. Макрокоманда – коротке посилання на макровизначення (виклик макроса)
3. Макророзширення (макропідстановка, макровставка) – вставка замість макрокоманди макроса з заміною формальних параметрів на фактичні (якщо вони є).
Макровизначення може простим та вкладеним, тобто містити у собі інше макровизначення. Рівень вкладання макровизначень може бути будь-яким, з одного макроса можна викликати інші макроси.
Існує три варіанти де повинні розташовуватися макровизначення:
На початку тексту програми до сегмента коду та даних. Цей варіант використовується тоді, коли визначені користувачем макрокоманди є актуальними в межах однієї програми.
В окремому файлі.
Такий варіант підходить при роботі з декількома програмами однієї проблемної області. Для того, щоб зробити доступними макровизначення у конкретній програмі, слід записати директиву include ім’я_файлу
В макробібліотеці.
Універсальні макрокоманди, які часто використовуються в програмах користувача, (наприклад, фрагменти програмної затримки, призупинення програми до натискання клавіші, перетворення двійкових чисел у символьну форму) доцільно записати в макробібліотеку. Макробібліотека являє собою файл з текстами макровизначень, які записуються у цей файл, як у текст програми. Файл макробібліотеки може мати будь-яке ім’я і розширення, наприклад, MYMACRO.MAC. В програмі залишаються тільки макровиклики. Включати макрокоманди з цієї бібліотеки в програму також можна за допомогою директиви include (наприклад, include mymacro.mac ). Після цього у програмі можна використовувати будь-які макрокоманди з цієї макробібліотеки.
Недоліком двох останніх способів є той факт, що у вихідний текст програми включаються абсолютно усі макровизначення. Для усунення цього недоліку використовується директива purge, в якості операндів через кому слід перелічити імена макрокоманд, які не повинні включатися в тіло програми.
PURGE ім’я_макроса відміняє визначений раніше макрос (не підтримується WASM). Ця директива часто застосовується відразу після INCLUDE, програми, що включила в текст, файл з великою кількістю готових макроозначень.
В цьому прикладі у вихідний текст програми перед початком компіляції TASM замість рядка include iomac.inc вставить рядки з файлу iomac.inc, однак у ньому будуть відсутні макровизначення _outstr та _exit.
Для організації циклу у макровизначенні мітку треба оголосити за допомогою оператора local.
LOCAL мітка... перераховує мітки, які застосовуватимуться усередині макроозначення, щоб не виникало помилки «мітка вже визначена» при використанні макросу більше одного разу або якщо та ж мітка присутня в основному тексті програми (в WASM директива LOCAL дозволяє використовувати макрос з мітками кілька разів, але не дозволяє застосовувати мітку з тим же ім'ям в програмі). Операнд для LOCAL мітка або список міток, які використовуватимуться в макросі.
Індивідуальні завдання:
Створіть максимальну можливу кількість макросів для вашої задачі та вставте у програму їх виклики.
В сегменті даних створити двовимірний масив, який складається з 15 натуральних чисел, розміщених у трьох рядках та п’яти стовпцях (масив відобразити на екрані). Піднести до другого ступеня останній елемент кожного стовпця. Результат вивести на екран.
Код програми:
;Макрос завершення програми
EndProgram Macro
mov ax, 4c00h
int 21h
endm
;Макрос виведення знаку '-'
Minus Macro
push ax dx
mov ah, 02h
mov dl, '-'
int 21h
pop dx ax
endm
;Макрос виведення символу переносу рядка
EndLine Macro
push ax dx
mov ah, 02h
mov dl, 10
int 21h
pop dx ax
endm
;Макрос для виведення пробілу
Space Macro
push ax dx
mov ah, 02h
mov dl, ' '
int 21h
pop dx ax
endm
;Макрос для перевірки кінця рядка
CheckEndLine Macro num, divv
local chck
push ax bx dx
mov ax, num
mov dx, 0
cwd
idiv divv
cmp dx, 0
jne chck
EndLine
chck:
pop dx bx ax
endm
;Макрос завантаження сегменту даних
Data Macro
mov ax, @data
mov ds, ax
endm
;Макрос виведення числа
PrintNum Macro num
local plus
local print
local exit
push ax bx dx cx
mov ax, num
cmp ax, 0; ax = 0
jge plus
neg ax
mov num, ax
Minus
plus:
mov ax, num; ax = num
mov cx, 0; cx = 0
print:
mov dx, 0
mov bx, 10
div bx
mov bx, ax
mov ax, dx
add ax, 30h
push ax
inc cx
mov ax, bx
cmp ax, 0
je exit
jmp print
exit:
mov ah, 02h
pop bx
mov dl, bl
int 21h
loop exit
pop cx dx bx ax
endm
;Макрос для виконання математичних операцій
ArrOperations Macro arr, aSize
local lp
local noChng
push ax bx cx dx si di
mov cx, aSize
mov bx, 0 ; bx - Лічильник
mov si, 0 ; si - ітератор в циклі
mov di, 0
lp:
mov ax, arr[si]
cmp bx, 4
jne noChng
cwd
imul ax ; множимо число саме на себе
mov bx, -1
noChng:
mov arr[si], ax
add si, 2
inc bx
loop lp
pop si dx cx bx ax
pop si dx cx bx ax
endm
;Макрос виведення масива
ArrPrint Macro arr,aSize
local lp
push ax bx cx si
mov bx, 10
mov cx, aSize
mov si, 0
lp:
mov ax, arr[si]
add si, 2
printNum ax
Space
checkEndLine si, bx
loop lp
pop si cx bx ax
endm
.model small
.stack 100h
.data
; Вихідний масив
arr dw 1, 2, 3, 4, 5
dw 6, 7, 8, 9, 10
dw 11, 12, 13, 14, 15
aSize dw 15 ; розмір масиву
.code
begin:
Data ; завантаження сегменту данних
ArrPrint arr, aSize ; виведення заданого масиву
EndLine ; новий рядок
ArrOperations arr, aSize ; виконання завдання згідно варіанту
ArrPrint arr, aSize ; виведення зміненого масиву
EndProgram ; завершення програми
end begin
Створення exe файлу й виконання програми:
/
Програма в турбодебагері
/
Програма викликана з консолі:
/
Висновок: ознайомлено з роботою макросів у асемблері та розроблено програму, яка виконує завдання згідно індивідуального варіанту.