Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Системное программирование.doc
Скачиваний:
178
Добавлен:
19.03.2015
Размер:
1.96 Mб
Скачать

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

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

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

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

  • регистр регистр;

  • регистр память;

  • память регистр;

  • непосредственный операнд регистр;

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

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

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

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

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

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

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

Операнд задается в команде.Для хранения такого операнда в команде выделяется поле длиной до 32 бит. Непосредственный операнд может быть только источником, но не приемником результата. Операнд получатель может находиться в памяти, либо в регистре. Например, командаMOVAX, 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. Например, командаINAL, 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. Синтаксически такой режим состоит в заключение имени регистра в квадратные скобки. Например, командаMOVAX, [BX] помещает в регистр AX содержимое размером слово по адресу из сегмента данных со смещением, хранящимся в регистре BX. Такой способ адресации позволяет динамически назначить адрес операнда, например, для организации циклических вычислений и работы с различными структурами данных (таблицами или массивами).

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

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

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

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

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

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

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

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