Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
13
Добавлен:
12.05.2015
Размер:
89.09 Кб
Скачать

    1. Програмування з використанням макрозасобів

Мета роботи - вивчення макрозасобів та одержання практичних навичок у складанні програм, що використовують макрозасоби для модифікації програм та їх параметрів.

1. Теоретичні відомості

Підпрограми являють собою ефективний апарат економії пам'яті при використанні функціонального підходу в структурному програмуванні. Однак, при використанні коротких елементарних операцій серйозно зростають питомі накладні витрати на їх реалізацію. Тому у випадках багаторазово повторюваних фрагментів програм доцільно використовувати препроцесорну обробку вхідного тексту програми, що реалізується макрозасобами і вбудованими процедурами.

1.1.Базові поняття макрозасобів

Макровизначення являє собою прообраз тексту програми, що відрізняється від неї тим, що використовує формальні параметри замість фактичних (за формою це нагадує підпрограму). Однак на відміну від підпрограм, що обробляють параметри в процесі виконання програми, параметри в макрозасобах обробляються на етапі трансляції. Макровизначення, як правило, розташовується на самому початку програмного модуля і оформлюється таким чином:

<ім'я макрокоманди> MACRO [список формальних параметрів]

LOCAL <мітки макровизначення>

прообраз тексту програми на асемблері

ENDM

В полі <ім'я макрокоманди> без двокрапки записується унікальне ім'я макрокоманди. В полі параметрів (воно може бути порожнім) записується список формальних параметрів (унікальних імен), розділених комами і використовуваних у прообразі тексту програми. Макрокоманда (макровиклик) призначений для виклику макровизначення і записується в тілі основної програми у вигляді:

[мітка:] <ім'я макрокоманди> [список фактичних параметрів]

Ім'я макрокоманди співпадає з іменем макровизначення, що викликається. Список фактичних параметрів може містити в собі порожні значення, константи, мнемоніки регістрів, імена міток чи змінних, використовуваних в асемблерній програмі. Кількість фактичних параметрів повинна дорівнювати кількості формальних (параметри, для яких відсутні значення, вважаються порожніми), номери їхніх позицій у полі параметрів повинні співпадати. Макророзширення є результатом обробки макроасемблером макрокоманди і макровизначення з таким же ім'ям, і являє собою текст програми з макровизначення, в якому замість формальних записані фактичні параметри. Якщо в програмі використовується кілька макрокоманд з однаковими іменами, то для одержання унікальних міток у макророзширенні слід застосовувати оператор LOCAL, в полі операндів якого перелічені усі використовувані в макровизначенні мітки.

1.2. Використання макрозасобів

Макрозасоби в асемблері IBM/PC застосовуються з тією ж метою, що і підпрограми, тобто для багаторазової реалізації алгоритму або його налаштування шляхом зміни внутрішніх кодів. Застосування макрозасобів істотно прискорює розробку та виконання програми (у порівнянні з використанням викликів підпрограм) - не потрібен час на виконання команд CALL, RET, проте при багаторазових однотипних макрокомандах необхідний більший обсяг пам'яті для програми, оскільки кожна макрокоманда включає в тіло програми відповідне макророзширення. Найчастіше макрозасоби використовуються для генерації викликаючих послідовностей, текстів настроюваних програм і керуючих таблиць. Використання макрозасобів, на відміну від процедур, дозволяє за рахунок зміни фактичних параметрів змінити не тільки вхідні дані, але і виконувані над ними дії. Змінити алгоритм обробки даних можна також застосовуючи директиви умовного асемблювання IF, ELSE, ENDIF у тексті макровизначення.

Синтаксис цієї директиви такий:

IF <логічний вираз>

текст фрагмента 1

ELSE

текст фрагмента 2

ENDIF

Якщо значення логічного виразу не дорівнює 0, транслюється код фрагмента 1, і не транслюється код фрагмента 2. Якщо значення логічного виразу дорівнює 0, транслюється код фрагменту 2, і не транслюється код фрагмента 1.

Приклад:

Записати max(a[i]mod b[i]) в стек:

aw dw 1,2,3 univers macro dlt, dlm ,t,reg, op, dopreg,cond,com,z

bw dw 4,-5,6 Local L1,L2

mov cx,(bw-aw)/2-1 mov cx,(dlt- dlm)/t-1

mov si,2 mov si,t

mov ax,aw mov reg,dlm

cwd op

div bw z&div dlt ; залишок в ah

;<mov dl,ah> ;for bytes com

push dx push dopreg

mov bp,sp mov bp,sp

L1: mov ax,aw[si] L1: mov reg,dlm[si]

cwd op

div bw[si] z&div dlt

com

cmp [bp],dx cmp [bp], dopreg

jnc l2 j&cond l2

xcgh [bp],dx xcgh [bp], dopreg

L2: add si,2 L2: add si,t

loop l1 loop l1

endm

.model small

.386

.......

Мінімальний знаковий залишок при діленні байтів:

univers bb, ab ,1,al, cbw, dx ,s, <mov dl,ah>,i

Максимальний беззнаковий залишок при діленні подвійних слів:

univers bd, ad ,4,eax, cdq, edx ,nc, ,

Мінімальний беззнаковий залишок при діленні слів:

univers bw, aw ,2,ax, cwd, dx ,c, ,

Соседние файлы в папке SP_ukr