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

9.2 Директиви асемблера

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

Директиви підпорядковані стандартному формату операторів асемблера, але вміст їх полів дещо інший, наприклад, в полі мітки директив MACRO, EQU i SET має обов’язково знаходитись символьна змінна, яка не завершується двокрапкою. В інших директивах в полі мітки може бути необов’язкова мітка, аналогічна міткам машинних команд. Мітка директиви відноситься до комірки пам’яті, яка іде зразу ж за останньою коміркою попередньої машинної команди. Операнди директив необов’язкові.

Директива ORG. Директива ORG (початок) має такий формат:

Мітка

Код

Операнд

Коментар

[мітка: ]

ORG

<вираз>

;формат директиви ORG

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

При необхідності в програмі може бути декілька директив ORG:

Мітка

Код

Операнд

Коментар

ORG

100H

; Задати абсолютну

; адресу 0100Н

LXI

H, AREA1

; Адреса=100Н

LXI

D, AREA2

; Адреса=103Н

MOV

A,M

; Адреса=106Н

NEW:

ORG

200H

; Задати абсолютну

; адресу 0200Н

RAL

; Адреса=0200Н

ANA

D

; Адреса=0201Н

Підкреслимо, що мітка NEW відноситься до комірки з адресою 0107, яка слідкує за коміркою з командою MOV A,M. Комірки 0107-01FF включені в об’єктну програму, але їх вміст не визначений.

Директива ORG може виконувати функції резервування пам’яті, наприклад, в такому фрагменті вона резервує 20 байтів:

Мітка

Код

Операнд

Коментар

MOV

A,M

RAL

JMP

LOWER

ORG

¤+20

LOWER:

ORA

A

Директива END. Формат директиви END:

Мітка

Код

Операнд

Коментар

[мітка: ]

END

;Формат ;директиви END

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

Директива EQU. Директива EQU ( прирівняти, присвоїти ) прямого присвоєння має такий формат:

Мітка

Код

Операнд

Коментар

<ім’я>

EQU

<вираз>

; формат директиви EQU

При виконанні директиви EQU програма-асемблер присвоює значення виразу символьній змінній (позначенню), що знаходиться в полі мітки. Коли змінна зустрічається в полі операнда, програма-асемблер підставляє замість неї присвоєне значення:

Мітка

Код

Операнд

Коментар

MASK

EQU

0F H

; Змінна MASK

***

; рівна 15

ANI

MASK

***

CPI

MASK

***

MVI

A, MASK

***

В командах ANI,CPI,MVI замість MASK буде фігурувати код 00001111. Якщо з деяких причин в програмі необхідно змінити значення MASK, то необхідно модифікувати операнд однієї директиви EQU і виконати повторне асемблерування програми.

Кожне символьне позначення змінної може появитись в полі мітки тільки однієї директиви EQU. При програмуванні необхідно згрупувати всі директиви EQU на початку або в кінці програми.

Директива SET. Директива SET (установити) має такий же формат і виконує такі ж дії, як і директива EQU. Одначе символьній змінній можна переприсвоїти нове значення за допомогою нової директиви SET:

Мітка

Код

Операнд

Коментар

NAME

SET

15

; Значення NAME рівне 15

***

MVI

B, NAME

; Завантажити 15 в регістр В

NAME

SET

1F H

; Значення NAME стає 31

***

ADI

NAME

; Добавити 31

***

CPI

NAME

; Порівняти з 31

***

Директива IF i ENDIF. Директива умовного асемблерування IF (якщо) і ENDIF (кінець якщо) використовується в асемблерних програмах таким чином:

Мітка

Код

Операнд

Коментар

[мітка: ]

IF

<вираз >

; Директива умовного

***

Оператори

; асемблерування

***

[мітка: ]

ENDIF

В процесі асемблерування обчислюється значення виразу із поля операнда директиви IF. Якщо воно рівне нулю, оператори між директивами IF i ENDIF ігноруються і не включаються в об’єктну програму. Коли ж значення виразу відрізняється від нуля, оператори програми асемблеруються так, щоб директиви IF i ENDIF були відсутніми.

Директиви умовного асемблерування корисні в тому випадку, коли програма складається з більшого числа сегментів і при асемблеруванні необхідно деякі сегменти виключити з об’єктної програми, наприклад, із-за наявності зміни в конфігурації МП-системи. Кожний сегмент обмежений директивами IF i ENDIF i для виключення сегменту значення операнда відповідної директиви IF прирівнюється до нуля, наприклад при допомозі директиви EQU.

Директива DB. Директива DB (визначити байт) відноситься до групи директив означення, яка використовується для ініціалізації даних і резервування пам’яті. Формат директиви DB має наступний вигляд:

Мітка

Код

Операнд

Коментар

[мітка: ]

DB

<список>

; Формат директиви DB

Операнд директиви DB може бути послідовністю виразів, розділених комами і такі, що мають 8-бітові значення, або ланцюжок символів, обмежених апострофами. При виконанні директиви DB значення виразів або коди символів запам’ятовуються в суміжних комірках пам’яті (байтах), які починаються за комірками попередньої команди. Приклади використання директиви DB:

Мітка

Код

Операнд

Коментар

M1:

DB

3,7,15,31

; Запам’ятовуються

***

; чотири значення

DB

‘HELLO’

; Запам’ятовуються

***

; п’ять символів

OMPL:

DB

-63

; Додатковий код - ; 63

Директива DW. Директива DW (визначити слово - два байти) також відноситься до директив означення і має такий же формат, як і директива DB. Одначе тут списком є послідовність виразів, які мають 16-бітові значення. При виконанні директиви DW обчислюється значення першого виразу і його молодші 8 бітів запам’ятовуються за поточною адресою, а старші 8 бітів запам’ятовуються за адресою на одиницю більшу за попередню. Далі визначається значення другого виразу, процедура запам’ятовування повторюється для наступних комірок пам’яті і т.д.. Приведемо приклад використання директиви DW:

Мітка

Код

Операнд

Коментар

ADDR:

DW

0FF00H

; (ADDR)=00H

; (ADDR+1)=FFH

DATA:

DW

100H,200H

; Ініціалізувати 4 комірки

Директива DS. Директива DS (означати пам’ять) має такий формат:

Мітка

Код

Операнд

Коментар

[мітка: ]

DS

<вираз>

; формат директиви DS

Обчислене значення виразу з поля операнда визначає число комірок (байтів) пам’яті, які резервуються для запам’ятовування даних. Ніякі значення в цих комірках не запам’ятовуються, зокрема, не можна вважати, що ці комірки містять нулі. Адреса наступного оператора рівна сумі адреси оператора, який передує директиві DS i значення виразу директиви DS. Приклади використання директиви DS:

Мітка

Код

Операнд

Коментар

ARRAY:

DS

32

; Резервується 32 комірки

TABLE:

DS

64

; Резервується 64 комірки

Асемблер МК51 дозволяє означити символьні імена, як адреси внутрішніх (псевдокоманда DATA), зовнішніх даних (XDATA) або адреси бітів (псевдокоманда ВІТ).

Приклади застосування даних псевдокоманд:

FLAG BIT 25H.3

;Присвоїти символьне ім’я FLAG 3 ;біту комірки ОЗП з адресою 25Н

X BIT P1.0

;і Х-0 біту порту Р1

CODE_EX DATA 20H

;Присвоїти символьне ім’я

;адресі 20Н комірки РДП

Для покращення зовнішнього виду і зручності документування в асемблері можуть використовуватись наступні директиви:

SPC (пропуск стрічки), яка означає, що при друці лістінга необхідно пропустити одну строку;

PAGE (сторінка), яка при друці лістінга викликає перехід на наступну сторінку;

TITLE (заголовок), яка викликає перехід на наступну сторінку з друком зверху сторінки заголовку програми, введеного програмістом.