Міністерство освіти і науки УкраїниНаціональний технічний університет України
«Київський політехнічний інститут ім. І. Сікорського»
Кафедра автоматизації проектування енергетичних процесів і систем
Лабораторна робота №8
з дисципліни «Операційні системи»
«Макрозасоби мови Асемблер»
КИЇВ-2022
Лабораторна робота №8
Мета роботи: Вивчення макросів, макрокоманд та макророзширень та їх застосування в асемблерних програмах.
Теоретична частина
Обробка програми на асемблері з використанням макрозасобів неявно здійснюється транслятором у дві фази: вихідна програма на асемблері (містить макроси); перша фаза трансляції: макроасемблер; вихідна програма з внутрішнім представленням компілятора (без макросів); друга фаза трансляції: асемблер; об’єктний модуль.
Макрозасоби Асемблера IBM PC мають три складові:
Макровизначення (макрос) – набір команд, який містить опис якоїсь дії або алгоритму. Макрос повинен знаходитися на початку програми, до визначення сегментів.
Синтаксис макровизначення:
ім’я_макроса MACRO [список_формальних_аргументів]
;; тіло макровизначення
Еndm
Макрокоманда – коротке посилання на макровизначення (виклик макроса):
ім’я_макроса MACRO [список_формальних_аргументів]
Макророзширення (макропідстановка, макровставка) – вставка замість макрокоманди макроса з заміною формальних параметрів на фактичні (якщо вони є).
Макровизначення може бути простим та вкладеним, тобто містити у собі інше макровизначення. Рівень вкладання макровизначень може бути будь-яким, з одного макроса можна викликати інші макроси.
Існує три варіанти де повинні розташовуватися макровизначення:
На початку тексту програми до сегмента коду та даних. Цей варіант використовується тоді, коли визначені користувачем макрокоманди є актуальними в межах однієї програми.
В окремому файлі.
Такий варіант підходить при роботі з декількома програмами однієї проблемної області. Для того, щоб зробити доступними макровизначення у конкретній програмі, слід записати директиву include ім’я_файлу.
В макробібліотеці.
Універсальні макрокоманди, які часто використовуються в програмах користувача, (наприклад, фрагменти програмної затримки, призупинення програми до натискання клавіші, перетворення двійкових чисел у символьну форму) доцільно записати в макробібліотеку. Макробібліотека являє собою файл з текстами макровизначень, які записуються у цей файл, як у текст програми. Файл макробібліотеки може мати будь-яке ім’я і розширення, наприклад, MYMACRO.MAC. В програмі залишаються тільки макровиклики. Включати макрокоманди з цієї бібліотеки в програму також можна за допомогою директиви include (наприклад, include mymacro.mac ). Після цього у програмі можна використовувати будь-які макрокоманди з цієї макробібліотеки.
PURGE ім’я_макроса відміняє визначений раніше макрос (не підтримується WASM). Ця директива часто застосовується відразу після INCLUDE, програми, що включила в текст, файл з великою кількістю готових макроозначень.
Для організації циклу у макровизначенні мітку треба оголосити за допомогою оператора local.
LOCAL мітка... перераховує мітки, які застосовуватимуться усередині макроозначення, щоб не виникало помилки «мітка вже визначена» при використанні макросу більше одного разу або якщо та ж мітка присутня в основному тексті програми (в WASM директива LOCAL дозволяє використовувати макрос з мітками кілька разів, але не дозволяє застосовувати мітку з тим же ім'ям в програмі). Операнд для LOCAL мітка або список міток, які використовуватимуться в макросі.
Завдання
Створіть максимальну можливу кількість макросів для вашої задачі та вставте у програму їх виклики.
Індивідуальне завдання (варіант 11): у сегменті даних створити лінійний масив, який містить 12 символьних величин. Вивести їх у зворотному порядку, розмістивши по три в рядок через чотири пропуски. Результат вивести на екран.
Код програми:
; Лабораторна робота 8
; Тимкова А.В., ТР-15, 23.06.2022
; Макрозасоби мови Асемблер
; 11 варіант
; Макрос виведення символу '-'
printMinus macro
push ax dx
mov ah, 02h
mov dl, '-'
int 21h
pop dx ax
endm
; Макрос виведення символу ' '
printSpace macro
push ax dx
mov ah, 02h
mov dl, ' '
int 21h
pop dx ax
endm
; Макрос переносу рядка (4 пропуски)
printEnter macro
push ax dx
mov ah, 02h
mov dl, 10
int 21h
mov ah, 02h
int 21h
mov ah, 02h
int 21h
mov ah, 02h
int 21h
pop dx ax
endm
; Макрос виведення числа
printNum macro num
local plus
local print
local exit
push ax bx dx cx
mov ax, num
cmp ax, 0
jge plus
neg ax
mov num, ax
printMinus
plus:
mov ax, num
mov 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
; Макрос виведення масиву
printArr macro arr, arrSize
local cycl
local finish
push ax bx cx si
mov cx, arrSize
mov si, 22
cycl:
mov ax, arr[si]
printNum ax
printSpace
mov ax, si
cwd
idiv temp
cmp dx, 0
jne finish
printEnter
finish:
sbb si, 2
loop cycl
pop si cx bx ax
endm
; Макрос завершення програми
Endpr Macro
mov ax, 4c00h
int 21h
endm
.model small
.stack 100h
.data
arr dw 1,22,5,19,4,6,0,18,53,10,31,12
arrSize dw 12
temp dw 3
.code
begin:
mov ax, @data
mov ds, ax
printArr arr, arrSize
mov ax, 4c00h
int 21h
end begin
Створення .ехе файлу:
/
Робота програми в середовищі налагоджувача ТD:
/
Результат виконання програми:
/
Лістинг:
Turbo Assembler Version 3.1 06/23/22 22:26:12 Page 1
lab8.asm
1 ; Лабораторна робота 8
2 ; Тимкова А.В., ТР-15, 23.06.2022
3 ; Макрозасоби мови Асемблер
4 ; 11 варіант
5
6
7 ; Макрос виведення символу '-'
8 printMinus macro
9 push ax dx
10 mov ah, 02h
11 mov dl, '-'
12 int 21h
13 pop dx ax
14 endm
15
16 ; Макрос виведення символу ' '
17 printSpace macro
18 push ax dx
19 mov ah, 02h
20 mov dl, ' '
21 int 21h
22 pop dx ax
23 endm
24
25 ; Макрос переносу рядка (4 пропуски)
26 printEnter macro
27 push ax dx
28 mov ah, 02h
29 mov dl, 10
30 int 21h
31 mov ah, 02h
32 int 21h
33 mov ah, 02h
34 int 21h
35 mov ah, 02h
36 int 21h
37 pop dx ax
38 endm
39
40 ; Макрос виведення числа
41 printNum macro num
42 local plus
43 local print
44 local exit
45 push ax bx dx cx
46 mov ax, num
47 cmp ax, 0
48 jge plus
49 neg ax
50 mov num, ax
51 printMinus
52 plus:
53 mov ax, num
54 mov cx, 0
55 print:
56 mov dx, 0
57 mov bx, 10
_Turbo Assembler Version 3.1 06/23/22 22:26:12 Page 2
lab8.asm
58 div bx
59 mov bx, ax
60 mov ax, dx
61 add ax, 30h
62 push ax
63 inc cx
64 mov ax, bx
65 cmp ax, 0
66 je exit
67 jmp print
68 exit:
69 mov ah, 02h
70 pop bx
71 mov dl, bl
72 int 21h
73 loop exit
74 pop cx dx bx ax
75 endm
76
77 ; Макрос виведення масиву
78 printArr macro arr, arrSize
79 local cycl
80 local finish
81 push ax bx cx si
82 mov cx, arrSize
83 mov si, 22
84
85 cycl:
86 mov ax, arr[si]
87 printNum ax
88 printSpace
89 mov ax, si
90 cwd
91 idiv temp
92 cmp dx, 0
93 jne finish
94 printEnter
95 finish:
96 sbb si, 2
97 loop cycl
98 pop si cx bx ax
99 endm
100
101 ; Макрос завершення програми
102 Endpr Macro
103 mov ax, 4c00h
104 int 21h
105 endm
106
107
108 0000 .model small
109 0000 .stack 100h
110 0000 .data
111 0000 0001 0016 0005 0013 + arr dw 1,22,5,19,4,6,0,18,53,10,31,12
112 0004 0006 0000 0012 +
113 0035 000A 001F 000C
114 0018 000C arrSize dw 12
_Turbo Assembler Version 3.1 06/23/22 22:26:12 Page 3
lab8.asm
115 001A 0003 temp dw 3
116 001C .code
117 0000 begin:
118 0000 B8 0000s mov ax, @data
119 0003 8E D8 mov ds, ax
120 printArr arr, arrSize
1 121 0005 50 53 51 56 push ax bx cx si
1 122 0009 8B 0E 0018r mov cx, arrSize
1 123 000D BE 0016 mov si, 22
1 124
1 125 0010 ??0000:
1 126 0010 8B 84 0000r mov ax, arr[si]
1 127 printNum ax
2 128 0014 50 53 52 51 push ax bx dx cx
2 129 0018 8B C0 mov ax, ax
2 130 001A 3D 0000 cmp ax, 0
2 131 001D 7D 0E jge ??0002
2 132 001F F7 D8 neg ax
2 133 0021 8B C0 mov ax, ax
2 134 printMinus
3 135 0023 50 52 push ax dx
3 136 0025 B4 02 mov ah, 02h
3 137 0027 B2 2D mov dl, '-'
3 138 0029 CD 21 int 21h
3 139 002B 5A 58 pop dx ax
2 140 002D ??0002:
2 141 002D 8B C0 mov ax, ax
2 142 002F B9 0000 mov cx, 0
2 143 0032 ??0003:
2 144 0032 BA 0000 mov dx, 0
2 145 0035 BB 000A mov bx, 10
2 146 0038 F7 F3 div bx
2 147 003A 8B D8 mov bx, ax
2 148 003C 8B C2 mov ax, dx
2 149 003E 05 0030 add ax, 30h
2 150 0041 50 push ax
2 151 0042 41 inc cx
2 152 0043 8B C3 mov ax, bx
2 153 0045 3D 0000 cmp ax, 0
2 154 0048 74 02 je ??0004
2 155 004A EB E6 jmp ??0003
2 156 004C ??0004:
2 157 004C B4 02 mov ah, 02h
2 158 004E 5B pop bx
2 159 004F 8A D3 mov dl, bl
2 160 0051 CD 21 int 21h
2 161 0053 E2 F7 loop ??0004
2 162 0055 59 5A 5B 58 pop cx dx bx ax
1 163 printSpace
2 164 0059 50 52 push ax dx
2 165 005B B4 02 mov ah, 02h
2 166 005D B2 20 mov dl, ' '
2 167 005F CD 21 int 21h
2 168 0061 5A 58 pop dx ax
1 169 0063 8B C6 mov ax, si
1 170 0065 99 cwd
1 171 0066 F7 3E 001Ar idiv temp
_Turbo Assembler Version 3.1 06/23/22 22:26:12 Page 4
lab8.asm
1 172 006A 83 FA 00 cmp dx, 0
1 173 006D 75 16 jne ??0001
1 174 printEnter
2 175 006F 50 52 push ax dx
2 176 0071 B4 02 mov ah, 02h
2 177 0073 B2 0A mov dl, 10
2 178 0075 CD 21 int 21h
2 179 0077 B4 02 mov ah, 02h
2 180 0079 CD 21 int 21h
2 181 007B B4 02 mov ah, 02h
2 182 007D CD 21 int 21h
2 183 007F B4 02 mov ah, 02h
2 184 0081 CD 21 int 21h
2 185 0083 5A 58 pop dx ax
1 186 0085 ??0001:
1 187 0085 83 DE 02 sbb si, 2
1 188 0088 E2 86 loop ??0000
1 189 008A 5E 59 5B 58 pop si cx bx ax
190 008E B8 4C00 mov ax, 4c00h
191 0091 CD 21 int 21h
192 end begin
_Turbo Assembler Version 3.1 06/23/22 22:26:12 Page 5
Symbol Table
Висновок: у ході лабораторної роботи було ознайомлено та вивчено макроси, макрокоманди та макророзширення, їх застосування в асемблерних програмах. Написано програму з макросами для створення лінійного масиву, який містить 12 символьних величин, виведення їх у зворотному порядку, елементи якого розміщені по три в рядок через чотири пропуски.