Формат операторов ассемблера

 

 

Строки исходного кода на языке Ассемблера имеют следующий формат:

 

<метка> <инструкция/директива> <операнды> <;комментарий>

 

где <метка> представляет собой необязательное имя идентификатора, <инструкция/директива> - это мнемоника инструкции или директивы, <операнды> - содержат сочетание 0, 1 или 2 (иногда более) констант, ссылок на память или регистры, или текстовых строк, как это требуется в каждой конкретной инструкции или директиве, <;комментарий> - необязательный комментарий.

Запись программы выполняется по свободному формату, т. е. специально не оговариваются правила заполнения каких бы то ни было позиций строки. Точка с запятой в начале строки означает, что данная строка является строкой комментария.

Программа может записываться как заглавными, так и строчными буквами. Метку произвольной длины следует записывать с начала строки и отдалять от кода операции двоеточием, за которым может следовать произвольное количество пробелов (вплоть до конца строки).

Код операции должен отделяться от списка операндов хотя бы одним пробелом. Операнды отделяются один от другого запятой.

 

Определение полей памяти для размещения данных.

Для определения данных в основной памяти и резервирования полей памяти под данные, размещаемые в основной памяти в процессе выполнения программы, используются следующие операторы:

DB - определить однобайтовое поле, DW - определить слово (двухбайтовое поле), DD - определить двойное слово (четырехбайтовое поле).

Формат команды: DB

[<имя поля>] DW [< количество> DUP (]{<список чисел >}[ )] DD ?,

где <количество>- количество полей памяти указанной длины, которое определяется данной командой (указывается, если определяется не одно поле памяти); ? - используется при резервировании памяти.

Приведем примеры.

1. Записать в память десятичное число 23 и присвоить этому байту имя а:

a db 23.

2. Зарезервировать 1 байт памяти:

db ?

3. Записать слово 1234h в память:

Dw 1234h.

4. Определить 31 байт памяти, повторяя последовательность 1, 2, 3, 4, 5, 1, 2, 3, 4,... :

Db 31 dup (1,2,3,4,5)

Примечание. При записи слов в память младший байт записывается в поле с младшим адресом. Например, в примере 3, если запись выполнялась по адресу 100, то по адресу 100 будет записано 34h, а по адресу 101 - 12h.

 

Операнды команд ассемблера

 

Операнды команд ассемблера могут определяться непосредственно в команде, находиться в регистрах или в основной памяти [35].

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

mov ah, 3 3 - литерал.

Если операнды команд ассемблера находятся в регистрах, то в соответствующих командах указываются имена регистров (если используемые регистры особо не оговариваются для данной команды. Например, в приведенном выше примере аh - имя регистра аккумулятора.

Адресация операндов, расположенных в основной памяти, может быть прямой и косвенной.

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

Inc OPND

Здесь OPND- символическое имя поля памяти, определенного оператором ассемблера

OPND dw ?

При трансляции программы ассемблер заменит символическое имя на исполнительный адрес указанного поля памяти (смещение относительно начала сегмента) и занесет этот адрес на место индексного смещения. Адресация в этом случае выполняется по схеме: +<индексное смещение>, но содержимое регистра ВР при вычислении исполнительного адреса не используется (частный случай).

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

[OPND +SI]

OPND [SI]

OPND + [SI]

[OPND] +[SI]

Приведенные выше формы записи косвенного адреса интерпретируются одинаково.

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

Примечание. При использовании косвенной адресации по схеме ВР + <индексное смещение> индексное смещение не может быть опущено, так как частный случай адресации по данной схеме с нулевой длиной индексного смещения используется для организации прямой адресации. Следовательно, при отсутствии индексного смещения в команде следует указывать нулевое индексное смещение, т.е. [ВР+0] .

Приведем два примера: [a+bx] и []+[si] +6.

В первом случае исполнительный адрес операнда определяется суммой содержимого регистра и индексного смещения, заданного символическим именем "а", а во втором - суммой содержимого регистров bp, si и индексного смещения, равного 6.

Длина операнда может определяться:

а) кодом команды - в том случае, если используемая команда обрабатывает данные определенной длины, что специально оговаривается;

б) объемом регистров, используемых для хранения операндов (1, 2 или 4 байта);

в) специальными указателями byte ptr(1байт) и word ptr(2 байта), которые используются в тех случаях, когда длину операнда нельзя установить другим способом. Например,

Mov byte ptr x, 255

т. е. операнд пересылается в поле с именем "х" и имеет длину 1 байт.

 

 

Команда пересылки данных

Данные в процессоре i86 перемещаются с помощью инструкции MOV. В действительности MOV (от слова переместить) - это не совсем удачное название данной инструкции. Более удачным было бы название COPY (копировать), так как инструкция MOV на самом деле записывает копию операнда-источника в операнд-приемник [38].

Например, инструкции:

mov ax,0

mov bx,9

mov ax,bx

сначала записывают в регистр AX константу 0, затем в регистр BX записывается константа 9, и, наконец, содержимое BX копируется в AX.

Заметим, что значение 9 не перемещается из BX в AX, оно просто копируется из регистра BX в регистр AX.

В инструкции MOV можно использовать почти любую пару операндов, что имеет смысл за исключением того случая, когда в качестве операнда используется сегментный регистр. В качестве операнда-источника (правого операнда) инструкции MOV можно использовать следующее: константу, выражение, при вычислении которого получается константа, общий регистр или ячейку памяти, доступную с помощью одного из режимов адресации. В качестве операнда-приемника (левого операнда) инструкции MOV может использоваться общий регистр или ячейка памяти.

Приведем примеры:

а) mov ax, сx- пересылка содержимого регистра сx в регистр ax;

б) mov cx, exword-пересылка 2 байт, расположенных в поле exword, из основной памяти в регистр cx;

в) mov si, 1000- запись числа 1000 в регистр si;

г) mov word ptr [di+555], 4- запись числа 4 длиной 2 байта в основную память по адресу [di+555].

Для загрузки «прямого» адреса в сегментный регистр используются две команды пересылки:

Mov ax, code

Mov ds, ax