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

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

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

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

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

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

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

29.05.2023 01:05-

Коментарі

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

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

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

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

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

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

Admin

26.02.2023 12:38

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