Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МПТ.doc
Скачиваний:
71
Добавлен:
03.11.2018
Размер:
20.52 Mб
Скачать

9.3 Макрокоманди

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

Розглянемо загальні засади використання макрокоманд на простих прикладах. Нехай в прикладній програмі декілька разів треба передати вміст регістра (D,E) в покажчик стеку SP. Однією командою це здійснити неможливо, оскільки в системі команд МП така команда відсутня. Необхідна передача реалізується ланцюжком команд XCHG,SPHL,XCHG. Визначимо приведену послідовність команд як макрокоманду з мнемонікою SPDE:

Мітка

Код

Операнд

Коментар

SPDE

MACRO

; Макрокоманда SPDE

XCHG

; передає вміст (D,E)

SPHL

; в покажчик стеку

XCHG

ENDM

***

SPDE

; Передати із (D,E) в SP

***

SPDE

; Передати із (D,E) в SP

***

Підкреслимо, що означена мнемоніка SPDE фігурує в полі мітки, а MACRO i ENDM є спеціальними директивами асемблера. Після означення макрокоманду SPDE можна використовувати як звичайну команду, розміщуючи її в полі мнемоніки.

Означимо далі макрокоманду SHV, яка зсуває вміст акумулятора вправо з записом у вільні біти нулів.

Число зсувів міститься в регістрі D:

Мітка

Код

Операнд

Коментар

SHV

MACRO

LOOP:

RRC

;Макрокоманди SHV простого

ANI

7FH

; зсуву

DCR

D

; акумулятора вправо

JNZ

LOOP

; Константа зсуву в

ENDM

; регістрі D

Наступний фрагмент показує використання даної макрокоманди для зсуву вправо вмісту комірки ІТЕМ на три біти:

Мітка

Код

Операнд

Коментар

LDA

ITEM

; Завантаження в акумулятор

MVI

D,3

; Задання числа зсувів

SHV

; Зсув на 3 біти

STA

ITEM

; Запам’ятовування в пам’яті

При виконанні даного фрагмента модифікується значення індикатора С (в команді RRC), а вміст регістра D є лічильником зсувів.

Можна розширити можливості макрокоманди SHV, якщо при означенні її не вказувати ні конкретний регістр-лічильник, ні число зсувів, а задати їх при безпосередньому зверненні до макрокоманди. Тобто мати макрокоманду з формальними параметрами. Макрокоманда SHV з двома параметрами (регістр REG, число зсувів VOL) визначається у такий спосіб:

Мітка

Код

Операнд

Коментар

SHV

MACRO

REG, VOL

; Приклад означення

MVI

REG, VOL

; макрокоманди

LOOP:

RRC

ANI

7FH

; SHV з двома

DCR

REG

; параметрами

JNZ

LOOP

ENDM

Тепер при зверненні до SHV в різних місцях прикладної програми можна використовувати як лічильник будь-який вільний регістр і задавати змінне число зсувів. Наприклад, для зсуву вмісту комірки ITEM по 5 бітів з регістром-лічильником L, необхідно записати:

Мітка

Код

Операнд

Коментар

LDA

ITEM

; Зсув вмісту

SHV

L, 5

; комірки з адресою ITEM

STA

ITEM

; на п’ять розрядів вправо

Ознайомившись із загальними принципами використання макрокоманд, зробимо строге визначення кожного етапу, зв’язаного з означенням, зверненням і розширенням макрокоманд.

Означення макрокоманд. Означення макрокоманди має такий формат:

Мітка

Код

Операнд

Коментар

<ім’я>

MACRO

<список параметрів>

***

Тіло

макрокоманди

***

ENDM

В полі мітки знаходиться ім’я (символьне позначення або мнемоніка), введена програмістом. А поле операнда-список формальних параметрів, називають також аргументами. Параметри розділюються комами і в загальному випадку можуть бути виразами. Група операторів між директивами MACRO i ENDM, називається тілом макрокоманди, може містити будь-які машинні команди, директиви (крім MACRO i ENDM), коментарі і звернення до інших макрокоманд, коли допускаються вкладені макрокоманди. Параметри визначаються при кожному зверненні до макрокоманди.

Звернення до макрокоманд. Звернення до означеної раніше в програмі макрокоманди має такий вигляд:

Міта

Код

Операнд

[мітка: ]

<ім’я>

<список параметрів>

В полі мнемоніки міститься ім’я макрокоманди, яке фігурує в полі мітки директиви MACRO, а в полі операнд-список фактичних параметрів. Значення параметрів підставляються в тіло макрокоманди зліва направо у відповідності з полем операнда директиви MACRO. Якщо у зверненні є менше параметрів, ніж у визначенні макрокоманди, то решта параметрів вважаються пустими, а якщо більше-

лишні ігноруються.

Розширення макрокоманд. Оператори, що утворюються в результаті підстановки фактичних параметрів в тіло макрокоманд, називають розширенням макрокоманди. Розширення має містити тільки допустимі оператори мови асемблера. Означимо, наприклад, макрокоманду STACK таким чином:

Мітка

Код

Операнд

Коментар

STACK

MACRO

R1

PUSH

R1

; Завантажити в стек

ENDM

; вміст регістра R1

Допустимими значеннями R1 є B,D,H,PSW, тому звернення STACK SP є помилковим.

Для запобігання конфліктам, що пов’язані з багаторазовим визначенням міток, програма-асемблер рахує мітки в макрокомандах локальними, тобто чинними в межах конкретного розширення. При необхідності створення глобальної мітки, необхідно закінчити мітку двома двокрапками замість однієї. Глобальна мітка може зустрічатись тільки один раз.

На завершення розглянемо макрокоманду IXAD індексної адресації. Вона завантажує в регістри (H,L) базову адресу BASE і добавляє до неї значення 16-бітового індекса, який зберігається в регістровій парі RP:

Мітка

Код

Операнд

Коментар

IXAD

MACRO

RP,BASE

LHI

H,BASE

; Завантаження базової адреси

DAD

RP

; Індексування

ENDM

Якщо базова адреса зберігається в двох суміжних комірках пам’яті з адресою BASE, то замість команди LXI необхідно використати команду LHLD BASE.

Асемблер для 16-розрядного процесора 8086 має свої особливості , які пов’язані з сегментацією пам’яті . Тому базовий асемблер доповнений низкою псевдооператорів для роботи з ними.