Читайте также:
|
|
Используются для идентификации переменных и полей памяти. Формат директивы
[имя] D* выражение [.выражение] [.................................................................................... ].
D* может быть:
a DB (define byte) — определить байт (1 байт);
Q DW (define word) — определить слово (2 байт);
a DD (define dword) — определить двойное слово (4 байт);
a DQ(define 8 byte) — определить8байт;
Q DT (define 10 byte) — определить 10 байт.
Рассматриваемые директивы определяют переменную (имя) или присваивают полям (ячейкам) памяти начальные значения; резервируют в памяти один или несколько байт — DB, слов — DW, двойных слов — DD и т. д. (с более поздним присвоением значения).
Выражение показывает, какое количество элементов памяти необходимо выделить и какие данные там должны содержаться. Выражение может быть:
- константой: const DB 56; const DW 1936; const DD 3FFH. Обязательно следует учитывать диапазон и вместимость байта, слова и т. д.; так, для DB константа не может быть больше 255, для DW - 65535, для DD - (65535)Л2=4294836225;
- вектором или таблицей: tab!el DB 30,4,-15,0,0,0,56; table2 DW 1936,3004,56,15. В одном псевдооператоре можно поместить строку до 132 позиций, причем вместо повторения одного и того же значения несколько раз (0 в tablet) можно использовать псевдооператорDUP(duplicate— дублировать):tab!el DB 30,4,-15,3 dup(0),56);
- строкой символов: strl DB 'Вы ввели слишком большое число1; str2 DB 'Bad command1; в псевдооператоре DB строка может содержать 255 символов, во всех остальных (DW. DD, DQ, DT) — только два символа.
- пустым полем: polel DB?; pole2 DW 12 dup(?), при этом в элементы резервируемой памяти ничего не записывается (записывается не 0, как, например, в директиве ро!еЗ DW 5 dup(0), а просто резервируются ячейки памяти);
- символическим именем переменной: varl DW dlsp; var2 DD vector (одна переменная определяется адресом другой, в директивах указывать offset не надо, ибо имя переменной воспринимается как ее адрес). Такой вариант может использоваться, например, для хранения адресов ячеек памяти, меток, на которые можно ссылаться в программе (varl DW dlsp), причем если переменная находится в том же сегменте, что и ссылающаяся команда, то достаточно в качестве адреса указать только смещение (2 байт), то есть обойтись DW; если же переменная находится в другом сегменте, то необходимо указать и сегмент, и смещение (всего 4 байт), то есть следует использовать уже DD (var2 DD vector);
- простым выражением: fnl DB 80*3; fn2 DW (disp)+256, вычисляемым, естественно, только при трансляции программы.
― Директивы определения сегментов и процедур
Сегмент определяется псевдооператорами:
имя_cer segment
…
имя_cer ends
В программе можно использовать четыре сегмента (по числу сегментных регистров) и для каждого указать соответствующий регистр сегмента псевдооператором ASSUME (assume — присвоить), например:
codeseg sedment
assume CS:codeseg, DS:dataseg, SS:stackseg
.
.
codeseg ends
В директиве Assume регистр_cer:имя_cer [...], в частности Assume cs: codeseg, указывается, что для сегмента имя_cer (codeseg) выбран регистр регистр__cer (CS).
После директивы Assume следует явным образом загрузить адрес начала сегмента данных в регистр DS:
mov AX, dataseg
mov DS, AX.
.Подобная же инициализация сегментных регистров CS и SS выполняется автоматически (по умолчанию). Процедура определяется псевдооператорами:
............................................................................................................................................................. имя_проц proc [far]..
..............................................................................................................................................................
..............................................................................................................................................................
............................................................................................................................................................. ret
............................................................................................................................................................. имя_проц endp
При определении процедуры после ргос должен быть указан атрибут дистанции near или far; если этого атрибута нет, то по умолчанию подразумевается near. Обычно процедура должна заканчиваться командой ret (return), то есть процедура является подпрограммой. Если процедура near, то обращение к ней (call) из того же сегмента; если proc far, то из любого сегмента (в этом случае командой ret из стека при возврате будет извлечено два слова: для IP и для CS).
Дата добавления: 2015-12-07; просмотров: 91 | Нарушение авторских прав