Основные понятия языка ассемблера

Способы задания операндов команды

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

Большинство команд требуют двух операндов, один из которых является операндом-источником, а второй – операндом приемником. Один операнд может располагаться в регистре или памяти, а второй операнд обязательно должен находиться в регистре или непосредственно в команде. Непосредственный операнд может быть только операндом-источником.

В двухоперандной команде возможны следующие сочетания операндов:

- регистр Û регистр;

- регистр Û память;

- память Û регистр;

- непосредственный операнд Û регистр;

- непосредственный операнд Û память.

Из перечисленных сочетаний наиболее часто употребляются регистр-память и память-регистр.

У правила есть исключения, которые касаются:

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

- команд работы со стеком, которые могут перемещать данные из памяти в стек;

- команд, использующих способ неявного задания операнда.

Операнд задается неявно. Команда явно не содержит операндов, но алгоритм ее выполнения использует некоторые регистры по умолчанию (регистры общего назначения, флаги в регистре флагов). Например, команды CLI и STI работают с флагом прерывания IF, а команда перекодировки символов XLAT используется без операндов, но требует наличия в регистре BX адреса смещения на таблицу перекодировки, а в регистре AL – порядкового номера исходного символа.

Операнд задается в команде. Для хранения такого операнда в команде выделяется поле длиной до 32 бит. Непосредственный операнд может быть только источником, но не приемником результата. Операнд получатель может находиться в памяти, либо в регистре. Например, команда MOV AX, 0FFFFh пересылает в регистр AX шестнадцатеричную константу FFFF.

Операнд находится в одном из регистров. Регистровые операнды указываются именами регистров. В качестве регистров могут использоваться:

- 32-разрядные регистры EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP;

- 16-разрядные регистры AX, BX, CX, DX, SI, DI, SP, BP;

- 8-разрядные регистры AH, AL, BH, BL, CH, CL, DH, DL;

- сегментные регистры CS, DS, SS, ES, FS, GS.

Сегментные регистры могут использоваться в качестве операндов только в инструкциях MOV, PUSH и POP. Сегментный регистр CS может быть источником в инструкции MOV, но не может быть приёмником. Он не может также использоваться в команде POP. Регистр флагов и указатель команд IP не могут использоваться в качестве явно задаваемых операндов.

Операндом является порт ввода-вывода. Помимо адресного пространства оперативной памяти микропроцессор поддерживает адресное пространство ввода-вывода объемом 64 Кб, используемое для доступа к периферийным устройствам. Для любого периферийного устройства в пространстве ввода-вывода выделяются адреса. Значение адреса в пределах этого пространства называется портом ввода-вывода.

Физически порту ввода-вывода соответствует аппаратный регистр, доступ к которому осуществляется с помощью команд IN и OUT. Например, команда IN AL, 60h читает байт из порта по адресу 60h. Регистры, адресуемые с помощью порта ввода-вывода, могут иметь разрядность 8, 16 или 32 бит. В качестве источника или получателя данных применяются регистры-аккумуляторы EAX, AX, AL. Выбор регистра определяется разрядностью порта. Адрес порта может задаваться непосредственным операндом в командах IN и OUT или значением в регистре DX.

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

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

Относительная прямая адресация используется для команд условных переходов. Поле смещения машинной команды содержит 8-, 16- или 32-битное значение, которое складывается с содержимым регистра указателя команд IP. В результате по полученному адресу и осуществляется переход.

Абсолютная прямая адресация. Исполнительный адрес является частью машинной команды, но формируется только из поля смещения. Для формирования физического адреса операнда в памяти микропроцессор складывает это поле со сдвинутым влево на 4 разряда значением сегментного регистра (см. раздел 5.4.1). В процессе трансляции ассемблер вычисляет и подставляет значение смещения имени в формируемую им машинную команду в поле смещение. В итоге машинная команда прямо адресует свой операнд, имея в одном из своих полей значение исполнительного адреса.

Косвенная адресация. Остальные виды адресации относятся к косвенным. В команде может находиться часть исполнительного адреса, а остальные компоненты располагаются в регистрах, на которые указывают своим содержимым байты ModRegR/M и SIB. Поле Mod определяет наличие и размер отклонения, а поле R/M – используемую комбинацию регистров. Поле Reg в формировании адреса не участвует. Формула вычисления исполнительного адреса при косвенной адресации имеет следующий вид:

 

 

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

 

 

Табл. 4. Компоненты эффективного адреса.

Структура данных Операнд в памяти Операнд в стеке
Базирования нет Базирование есть
Простая переменная disp BX+disp BP+disp
Массив SI DI BX+SI BX+DI BP+SI BP+DI
Массивы из записей SI+disp DI+disp BX+SI+disp BX+DI+disp BP+SI+disp BP+DI+disp

 

 

Косвенная базовая адресация. Исполнительный адрес операнда находится в базовом регистре BX или BP. Синтаксически такой режим состоит в заключение имени регистра в квадратные скобки. Например, команда MOV AX, [BX] помещает в регистр AX содержимое размером слово по адресу из сегмента данных со смещением, хранящимся в регистре BX. Такой способ адресации позволяет динамически назначить адрес операнда, например, для организации циклических вычислений и работы с различными структурами данных (таблицами или массивами).

Косвенная базовая адресация со смещением. Адресация предназначена для доступа к данным с известным смещением относительно некоторого базового адреса. Например, команда MOV AX, M[BX] пересылает в регистр AX слово из области памяти по адресу: значение регистра BX плюс значение идентификатора M. Транслятор присваивает каждому идентификатору значение, равное смещению этого идентификатора относительно начала сегмента данных. В примере используется модификация адреса (BX регистр-модификатор).

Совместно регистр и смещение используются в двух случаях:

- При индексации в массивах, элементы которых имеют размер, отличный от 2, 4 и 8 бит. Смещение кодирует относительный адрес начала массива, а регистр определяет смещение элемента внутри массива.

- При доступе к полям записи. В этом случае регистр базы содержит адрес начала записи, а смещение определяет относительный адрес поля.

Косвенная индексная адресация со смещением. Особенностью адресации является возможность масштабирования содержимого индексного регистра, что обеспечивает эффективное индексирование в массивах, элементы которых имеют размер 2, 4 или 8 бит (поле масштаба SS байта SIB). Смещение указывает адрес начала массива, а индексный регистр содержит порядковый номер нужного элемента.

Микропроцессор преобразует номер элемента в его смещение относительно начала массива, используя коэффициент масштабирования. Например, по команде MOV AX, M[SI*2] значение исполнительного адреса второго операнда будет вычислено как сумма значения идентификатора M и регистра SI, умноженного на 2.

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

Например, команда ADD AX, M[SI][BX] производит сложение содержимого регистра AX с содержимым слова по адресу: значение идентификатора M плюс содержимое регистров SI и BX. Для эффективного индексирования в двумерном массиве используют масштабирование содержимого индексного регистра (если элементы массива имеют размер 2, 4 или 8 битов).

Контрольные вопросы

1. Какие существуют способы представления числовой информации в ЭВМ?

2. Перечислите и опишите назначение регистров общего назначения.

3. Опишите структуру машинной команды.

4. Перечислите основные режимы адресации и приведите примеры.