Міністерство освіти і науки УкраїниНаціональний технічний університет України
«Київський політехнічний інститут ім. І. Сікорського»
Кафедра автоматизації проектування енергетичних процесів і систем
Лабораторна робота №8
з дисципліни «Операційні системи»
«Макрозасоби мови Асемблер»
Варіант №16
КИЇВ-2022
Мета: Вивчення макросів, макрокоманд та макророзширень та їхзастосування в асемблерних програмах.
Теоретична частина:
Обробка програми на асемблері з використанням макрозасобів неявно здійснюється транслятором у дві фази.
Макрозасоби Асемблера IBM PC мають три складові:
1. Макровизначення (макрос) – набір команд, який містить опис якоїсь дії або алгоритму. Макрос повинен знаходитися на початку програми, до визначення сегментів.
Синтаксис макровизначення:
ім’я_макроса MACRO [список_формальних_аргументів];тіло макровизначення
Endm
2. Макрокоманда – коротке посилання на макровизначення (виклик макроса):
ім’я_макроса MACRO [список_формальних_аргументів]
3. Макророзширення (макропідстановка, макровставка) – вставка замість макрокоманди макроса з заміною формальних параметрів на фактичні (якщо вони є).
Існує три варіанти де повинні розташовуватися макровизначення:
На початку тексту програми до сегмента коду та даних. Цей варіант використовується тоді, коли визначені користувачем макрокоманди є актуальними в межах однієї програми.
В окремому файлі. Такий варіант підходить при роботі з декількома програмами однієї проблемної області. Для того, щоб зробити доступними макровизначення у конкретній програмі, слід записати директиву include ім’я_файлу.
В макробібліотеці. Універсальні макрокоманди, які часто використовуються в програмах користувача, (наприклад, фрагменти програмної затримки, призупинення програми до натискання клавіші, перетворення двійкових чисел у символьну форму) доцільно записати в макробібліотеку. Макробібліотека являє собою файл з текстами макровизначень, які записуються у цей файл, як у текст програми. Файл макробібліотеки може мати будь-яке ім’я і розширення, наприклад, MYMACRO.MAC. В програмі залишаються тільки макровиклики.
Недоліком двох останніх способів є той факт, що у вихідний текст програми включаються абсолютно усі макровизначення. Для усунення цього недоліку використовується директива purge, в якості операндів через кому слід перелічити імена макрокоманд, які не повинні включатися в тіло програми.
Для організації циклу у макровизначенні мітку треба оголосити за допомогою оператора local.
LOCAL мітка... перераховує мітки, які застосовуватимуться усередині макроозначення, щоб не виникало помилки «мітка вже визначена» при використанні макросу більше одного разу або якщо та ж мітка присутня в основному тексті програми (в WASM директива LOCAL дозволяє використовувати макрос з мітками кілька разів, але не дозволяє застосовувати мітку з тим же ім'ям в програмі). Операнд для LOCAL мітка або список міток, які використовуватимуться в макросі.
Завдання:
Створіть максимальну можливу кількість макросів для вашої задачі та вставте у програму їх виклики.
Індивідуальні завдання:
16. В сегменті даних створити квадратну матрицю 5*5. Діагональні елементи піднести до другого ступеня.
Код для завдання 16 варіанту з коментарями:
; Хавкін А.Д. гр. ТР-15 , 16 варіант
; Макрозасоби
loadData macro
mov ax, Datas ; ініціалізація сегменту даних
mov ds, ax
endm
printNum macro ;виведення числа (елементу масиву)
local convtToDec
local printDec
xor cx, cx
mov bx, 10
convtToDec:
xor dx, dx
div bx
push dx
inc cx
test ax, ax
jnz convtToDec
mov ah, 02h
printDec:
pop dx
add dl, 30h
int 21h
loop printDec
endm
newLine macro;макрос для перехіду на наступний рядок
mov dx, offset CR_LF
mov ah, 09h
int 21h
endm
printSpace macro;макрос для виводу відстані між елементами масиву
mov ah, 02h
mov dl, 09h ;' '
int 21h
endm
printArr macro;виведення масиву на екран
local rows
local columns
local pos
local neg
local nextEl
xor si,si
xor cx,cx
mov cx,row
newLine
rows:
push cx
mov cx,column
columns:
xor ax,ax
lea bx, array
mov ax, [bx][si]
push cx
cmp ax, 0
printNum
jmp nextEl
nextEl:
printSpace
add si,2
pop cx
loop columns
newLine
pop cx
loop rows
endm
changeArr macro;макрос для зміни масиву
local iter
lea bx, array [0]
xor si, si
xor cx, cx
mov cx, 5
mov si, 0
iter:
mov ax, [bx][si]
mov dx, [bx][si]
imul dx
mov [bx][si], ax
add si,12
loop iter
endm
Datas segment;ініціалізація сегменту даних
CR_LF db 0dh,0ah,'$'
array dw 1,2,3,4,5
dw 6,7,8,9,10
dw 11,12,13,14,15
dw 16,17,18,19,20
dw 21,22,23,24,25
column dw 5
row dw 5
Datas ends
Codes segment
Assume cs: Codes, ds: Datas
begin:
loadData
printArr
changeArr
printArr
mov ah, 4ch
mov al, 0
int 21h
Codes ends
end begin
Створення *.EXE файлу та відкриття його у TD:
/
Вигляд TD після запуску lab8.exe :
/
Виконаємо програму покроково за допомогою F7 та перевіряємо проміжні результати у регістрі ax. Вигляд TD після проходження програми повністю:
/
Виведення в консольному режимі отриманого результату:
/
Лістинг:
Turbo Assembler Version 3.1 06/26/22 00:28:48 Page 1
lab8.ASM
1 ; Хавкін А.Д. гр. ТР-15 , 16 варіант
2 ; Макрозасоби
3
4 loadData macro
5 mov ax, Datas ; ініціалізація сегменту даних
6 mov ds, ax
7 endm
8
9 printNum macro ;виведення числа (елементу масиву)
10 local convtToDec
11 local printDec
12 xor cx, cx
13 mov bx, 10
14
15 convtToDec:
16 xor dx, dx
17 div bx
18 push dx
19 inc cx
20 test ax, ax
21 jnz convtToDec
22 mov ah, 02h
23
24 printDec:
25 pop dx
26 add dl, 30h
27 int 21h
28 loop printDec
29 endm
30
31 newLine macro;макрос для перехіду на наступний рядок
32 mov dx, offset CR_LF
33 mov ah, 09h
34 int 21h
35 endm
36
37 printSpace macro;макрос для виводу відстані між елементами +
38 масиву
39 mov ah, 02h
40 mov dl, 09h ;' '
41 int 21h
42 endm
43
44 printArr macro;виведення масиву на екран
45 local rows
46 local columns
47 local pos
48 local neg
49 local nextEl
50 xor si,si
51 xor cx,cx
52 mov cx,row
53 newLine
54 rows:
55 push cx
56 mov cx,column
57 columns:
_Turbo Assembler Version 3.1 06/26/22 00:28:48 Page 2
lab8.ASM
58 xor ax,ax
59 lea bx, array
60 mov ax, [bx][si]
61 push cx
62 cmp ax, 0
63 printNum
64 jmp nextEl
65
66 nextEl:
67 printSpace
68 add si,2
69 pop cx
70 loop columns
71 newLine
72 pop cx
73 loop rows
74 endm
75
76 changeArr macro;макрос для зміни масиву
77 local iter
78 lea bx, array [0]
79 xor si, si
80 xor cx, cx
81 mov cx, 5
82 mov si, 0
83 iter:
84 mov ax, [bx][si]
85 mov dx, [bx][si]
86 imul dx
87 mov [bx][si], ax
88 add si,12
89 loop iter
90 endm
91
92 0000 Datas segment;ініціалізація сегменту даних
93 0000 0D 0A 24 CR_LF db 0dh,0ah,'$'
94 0003 0001 0002 0003 0004 + array dw 1,2,3,4,5
95 0005
96 000D 0006 0007 0008 0009 + dw 6,7,8,9,10
97 000A
98 0017 000B 000C 000D 000E + dw 11,12,13,14,15
99 000F
100 0021 0010 0011 0012 0013 + dw 16,17,18,19,20
101 0014
102 002B 0015 0016 0017 0018 + dw 21,22,23,24,25
103 0019
104 0035 0005 column dw 5
105 0037 0005 row dw 5
106 0039 Datas ends
107
108 0000 Codes segment
109 Assume cs: Codes, ds: Datas
110 0000 begin:
111 loadData
1 112 0000 B8 0000s mov ax, Datas ; ініціалізація сегменту даних
1 113 0003 8E D8 mov ds, ax
114 printArr
_Turbo Assembler Version 3.1 06/26/22 00:28:48 Page 3
lab8.ASM
1 115 0005 33 F6 xor si,si
1 116 0007 33 C9 xor cx,cx
1 117 0009 8B 0E 0037r mov cx,row
1 118 newLine
2 119 000D BA 0000r mov dx, offset CR_LF
2 120 0010 B4 09 mov ah, 09h
2 121 0012 CD 21 int 21h
1 122 0014 ??0000:
1 123 0014 51 push cx
1 124 0015 8B 0E 0035r mov cx,column
1 125 0019 ??0001:
1 126 0019 33 C0 xor ax,ax
1 127 001B BB 0003r lea bx, array
1 128 001E 8B 00 mov ax, [bx][si]
1 129 0020 51 push cx
1 130 0021 3D 0000 cmp ax, 0
1 131 printNum
2 132 0024 33 C9 xor cx, cx
2 133 0026 BB 000A mov bx, 10
2 134
2 135 0029 ??0005:
2 136 0029 33 D2 xor dx, dx
2 137 002B F7 F3 div bx
2 138 002D 52 push dx
2 139 002E 41 inc cx
2 140 002F 85 C0 test ax, ax
2 141 0031 75 F6 jnz ??0005
2 142 0033 B4 02 mov ah, 02h
2 143
2 144 0035 ??0006:
2 145 0035 5A pop dx
2 146 0036 80 C2 30 add dl, 30h
2 147 0039 CD 21 int 21h
2 148 003B E2 F8 loop ??0006
1 149 003D EB 01 90 jmp ??0004
1 150
1 151 0040 ??0004:
1 152 printSpace
2 153 0040 B4 02 mov ah, 02h
2 154 0042 B2 09 mov dl, 09h ;' '
2 155 0044 CD 21 int 21h
1 156 0046 83 C6 02 add si,2
1 157 0049 59 pop cx
1 158 004A E2 CD loop ??0001
1 159 newLine
2 160 004C BA 0000r mov dx, offset CR_LF
2 161 004F B4 09 mov ah, 09h
2 162 0051 CD 21 int 21h
1 163 0053 59 pop cx
1 164 0054 E2 BE loop ??0000
165 changeArr
1 166 0056 BB 0003r lea bx, array [0]
1 167 0059 33 F6 xor si, si
1 168 005B 33 C9 xor cx, cx
1 169 005D B9 0005 mov cx, 5
1 170 0060 BE 0000 mov si, 0
1 171 0063 ??0007:
_Turbo Assembler Version 3.1 06/26/22 00:28:48 Page 4
lab8.ASM
1 172 0063 8B 00 mov ax, [bx][si]
1 173 0065 8B 10 mov dx, [bx][si]
1 174 0067 F7 EA imul dx
1 175 0069 89 00 mov [bx][si], ax
1 176 006B 83 C6 0C add si,12
1 177 006E E2 F3 loop ??0007
178 printArr
1 179 0070 33 F6 xor si,si
1 180 0072 33 C9 xor cx,cx
1 181 0074 8B 0E 0037r mov cx,row
1 182 newLine
2 183 0078 BA 0000r mov dx, offset CR_LF
2 184 007B B4 09 mov ah, 09h
2 185 007D CD 21 int 21h
1 186 007F ??0008:
1 187 007F 51 push cx
1 188 0080 8B 0E 0035r mov cx,column
1 189 0084 ??0009:
1 190 0084 33 C0 xor ax,ax
1 191 0086 BB 0003r lea bx, array
1 192 0089 8B 00 mov ax, [bx][si]
1 193 008B 51 push cx
1 194 008C 3D 0000 cmp ax, 0
1 195 printNum
2 196 008F 33 C9 xor cx, cx
2 197 0091 BB 000A mov bx, 10
2 198
2 199 0094 ??000D:
2 200 0094 33 D2 xor dx, dx
2 201 0096 F7 F3 div bx
2 202 0098 52 push dx
2 203 0099 41 inc cx
2 204 009A 85 C0 test ax, ax
2 205 009C 75 F6 jnz ??000D
2 206 009E B4 02 mov ah, 02h
2 207
2 208 00A0 ??000E:
2 209 00A0 5A pop dx
2 210 00A1 80 C2 30 add dl, 30h
2 211 00A4 CD 21 int 21h
2 212 00A6 E2 F8 loop ??000E
1 213 00A8 EB 01 90 jmp ??000C
1 214
1 215 00AB ??000C:
1 216 printSpace
2 217 00AB B4 02 mov ah, 02h
2 218 00AD B2 09 mov dl, 09h ;' '
2 219 00AF CD 21 int 21h
1 220 00B1 83 C6 02 add si,2
1 221 00B4 59 pop cx
1 222 00B5 E2 CD loop ??0009
1 223 newLine
2 224 00B7 BA 0000r mov dx, offset CR_LF
2 225 00BA B4 09 mov ah, 09h
2 226 00BC CD 21 int 21h
1 227 00BE 59 pop cx
1 228 00BF E2 BE loop ??0008
_Turbo Assembler Version 3.1 06/26/22 00:28:48 Page 5
lab8.ASM
229 00C1 B4 4C mov ah, 4ch
230 00C3 B0 00 mov al, 0
231 00C5 CD 21 int 21h
232 00C7 Codes ends
233 end begin
Висновок: у даній лабораторній роботі було освоєно принцип роботи з макрозасобами мови Асемблер. Було створено макроси і використано у коді. Зроблено звіт та надіслано викладачу.