double arrow

Псевдооператоры


Псевдооператоры управляют работой Ассемблера, а не микропроцессора. С помощью псевдоопереторов можно определять сегменты и процедуры, давать имена командам и элементам данных, резервировать рабочие области памяти, управлять листингом программы и другие выполнять множество других функций. В отличии от команд языка ассемблера большинство псевдооператоров не генерируют объектного кода.

3.1 Директивы определения данных

Для того чтобы в программе на ассемблере зарезервировать ячейки памяти под константы и переменные, необходимо воспользоваться директивами определения данных - с названиями DB (описывает данные размером в байт), DW (размером в слово) и DD (размером в двойное слово). (Директивы, или команды ассемблеру, - это предложения программы, которыми ее автор сообщает какую-то информацию ассемблеру или просит что-то сделать дополнительно, помимо перевода символьных команд на машинный язык.)

В простейшем случае в директиве DB, DW или DD описывается одна константа, которой дается имя для последующих ссылок на нее. По этой директиве ассемблер формирует машинное представление константы (в частности, если надо, "переворачивает" ее) и записывает в очередную ячейку памяти. Адрес этой ячейки становится значением имени: все вхождения имени в программу ассемблер будет заменять на этот адрес. Имена, указанные в директивах DB, DW и DD, называются именами переменных (в отличие от меток - имен команд).

В ассемблере числа записываются в нормальном (неперевернутом) виде в cистемах счисления с основанием 10, 16, 8 или 2. Десятичные числа записываются как обычно, за шестнадцатиричным числом ставится буква h (если число начинается с "цифры" A, B, ..., F, то вначале обязателен 0), за восьмиричным числом - буква q или o, за двоичным числом - буква b.

Примеры:

A DB 162 ;описать константу-байт 162 и дать ей имя A

B DB 0A2h ;такая же константа, но с именем B

С DW -1 ;константа-слово -1 с именем С

D DW 0FFFFh ;такая же константа-слово, но с именем D

E DD -1 ;-1 как двойное слово

Константы-символы описываются в директиве DB двояко: указывается либо код символа (целое от 0 до 255), либо сам символ в кавычках (одинарных или двойных); в последнем случае ассемблер сам заменит символ на его код. Например, следующие директивы эквивалентны (2A - код звездочки в ASCII):

CH DB 02AH

CH DB '*'

Константы-адреса, как правило, задаются именами. Так, по директиве

ADR DW CH

будет отведено слово памяти, которому дается имя ADR и в которое запишется адрес (смещение), соответствующий имени CH. Если такое же имя описать в директиве DD, то ассемблер автоматически добавит к смещению имени его сегмент и запишет смещение в первую половину двойного слова, а сегмент - во вторую половину.

По любой из директив DB, DW и DD можно описать переменную, т.е. отвести ячейку, не дав ей начального значения. В этом случае в правой части директивы указывается вопросительный знак:

F DW ? ;отвести слово и дать ему имя F, ничего в этот байт не записывать

В одной директиве можно описать сразу несколько констант и/или переменных одного и того же размера, для чего их надо перечислить через запятую. Они размещаются в соседних ячейках памяти. Пример:

G DB 200, -5, 10h, ?, 'F'

Имя, указанное в директиве, считается именующим первую из констант. Для ссылок на остальные в ассемблере используются выражения вида <имя>+<целое>; например, для доступа к байту с числом -5 надо указать выражение G+1, для доступа к байту с 10h - выражение G+2 и т.д.

Если в директиве DB перечислены только символы, например:

S DB 'a','+','b'

тогда эту директиву можно записать короче, заключив все эти символы в одни кавычки:

S DB 'a+b'

И, наконец, если в директиве описывается несколько одинаковых констант (переменных), то можно воспользоваться конструкцией повторения

K DUP(a,b,...,c)

которая эквивалентна повторенной k раз последовательности a,b,...,c.

Например, директивы

V1 DB 0,0,0,0,0

V2 DW ?,?,?,?,?,?,?,?,?,'a',1,2,1,2,1,2,1,2

можно записать более коротко таким образом:

V1 DB 5 DUP(0)

V2 DW 9 DUP(?), 'a', 4 DUP(1,2)


Сейчас читают про: