Основные директивы ассемблера 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Основные директивы ассемблера



Напомним, что директивы (псевдооператоры) — это инструкции ассемблеру, они обрабатываются только при ассемблировании (трансляции) программы. Приведем некоторые из часто используемых директив.

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

Присваивают идентификатору с данным именем некоторое текстовое или числовое значение (выражение). Формат директив:

имя EQU текст

имя = числовое значение (выражение)

Разница между псевдооператорами EQU и =:

l EQU — присваивает значение постоянно (изменять нельзя), текст может быть символьным, числовым или смешанным выражением, определяющим константу, адрес, другое символьное имя, метку и т.д.;

l = — выполняет текущее присваивание (значение может быть переназначено, но только при трансляции, естественно); присваивает только числовое выражение, содержащее простые математические преобразования, которые при трансляции и будут выполнены (например: const + 1, 15H*4, 3*12/4 и т.п.).

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

Используются для идентификации переменных и полей памяти. Формат директивы

[имя] D* выражение [,выражение] [,...].

Ключевые слова D* могут быть следующими:

l DB — определить байт (1 байт);

l DW — определить слово (2 байта);

l DD — определить двойное слово (4 байта);

l DQ — определить 8 байтов;

l DT— определить 10 байтов.

Рассматриваемые директивы объявляют переменную (имя) или присваивают полям (ячейкам) памяти начальные значения; резервируют в памяти (с более поздним присвоением значения) один или несколько байтов — DB, слов — DW, двойных слов — DD и т.д.

Выражение показывает, какое количество элементов памяти необходимо выделить и какие данные там должны содержаться. Выражение может быть:

l константой:
const DB 56; const DW 1936; const DD 3FFH.
Обязательно следует учитывать диапазон и вместимость байта, слова и т.д.; так, для DB константа не может быть больше 255, для DW — 65 535, для DD —

l 65 5352 – 1 = 4 294 967 295;

l вектором или таблицей:  
table1 DB 30, 4, –15, 0, 0, 0, 56; table2 DW 1936, 3004, 56, 15.
В одном псевдооператоре допускается поместить строку до 132 позиций, причем вместо повторения одного и того же значения несколько раз (0 в table1) можно использовать псевдооператор DUP (duplicate — дублировать):
table1 DB 30, 4, –15, 3 dup(0), 56);

l строкой символов:
str1 DB 'Вы ввели слишком большое число';
str2 DB 'Bad command';
в псевдооператоре DB строка может содержать 255 символов, во всех остальных (DW, DD, DQ, DT) — только 2 символа.

l пустым полем:
pole1 DB?; pole2 DW 12 dup(?),
при этом в элементы резервируемой памяти при загрузке программы ничего не записывается (заносится не 0, как, например, в директиве pole3 DW 5 dup(0), а просто резервируются ячейки памяти);

l символическим именем переменной:
var1 DW disp; var2 DD vector
(одна переменная определяется адресом другой, в директивах указывать offset не надо, поскольку имя переменной воспринимается как ее адрес). Такой вариант подходит, например, для хранения адресов ячеек памяти, меток, на которые допустимо ссылаться в программе (var1 DW disp), причем, если переменная находится в том же сегменте, что и ссылающаяся команда, то достаточно в качестве адреса указать только смещение (2 байта), то есть обойтись DW; если же переменная находится в другом сегменте, то необходимо указать и сегмент, и смещение (всего 4 байта), то есть следует использовать уже DD (var2 DD vector);

l простым выражением:    
fn1 DB 80*3; fn2 DW (disp) + 256, вычисляемым, разумеется, только при трансляции программы.

Директивы определения сегментов и процедур

Сегмент определяется псевдооператорами:

имя_сег segment

...

имя_сег ends

В программе можно использовать 4 сегмента (по числу сегментных регистров) и для каждого указать соответствующий регистр сегмента псевдооператором ASSUME(assume — присвоить), например:

codeseg sedment

assume CS:codeseg, DS:dataseg, SS:stackseg

..

codeseg ends

В директиве ASSUME регистр_сег:имя_сег [,..], в частности, ASSUME cs:codeseg, указывается, что для сегмента имя_сег (codeseg) выбран регистр регистр_сег (CS).

После директивы ASSUME следует явным образом загрузить адрес начала сегмента данных в регистр DS:

mov AX, dataseg

mov DS, AX

Процедура определяется псевдооператорами:

имя_процедуры proc [far]...

 ...

ret

имя_процедуры endp

При определении процедуры после ключевого слова proc должен быть указан атрибут дистанции nearили far; если этого атрибута нет, то по умолчанию подразумевается near. Обычно процедура должна заканчиваться командой ret (return). Если процедура объявлена как near, то обращение к ней (call) должно производиться из того же сегмента; если procfar, то из любого сегмента (в этом случае командой ret из стека при возврате будет извлечено два слова: для IP и для CS).



Поделиться:


Последнее изменение этой страницы: 2021-11-27; просмотров: 69; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.141.202.54 (0.005 с.)