Макрозасоби мови Асемблер

Інформація про навчальний заклад

ВУЗ:
Національний технічний університет України Київський політехнічний інститут
Інститут:
О
Факультет:
ІСМ
Кафедра:
Не вказано

Інформація про роботу

Рік:
2022
Тип роботи:
Лабораторна робота
Предмет:
Операційні системи

Частина тексту файла (без зображень, графіків і формул):

Міністерство освіти і науки України Національний технічний університет України «Київський політехнічний інститут  ім. І. Сікорського» Кафедра автоматизації проектування енергетичних процесів і систем Лабораторна робота №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 Висновок: у даній лабораторній роботі було освоєно принцип роботи з макрозасобами мови Асемблер. Було створено макроси і використано у коді. Зроблено звіт та надіслано викладачу.
Антиботан аватар за замовчуванням

07.07.2023 19:07-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!