|
Для выполнения абсолютного большинства команд требуются данные, которые извлекаются либо из памяти, либо из регистров. Для именования этих данных в 8088 предусмотрено несколько режимов адресации. Многие команды содержат по два операнда, которые в этом случае обычно называются исходным (источник) и целевым (приемник). Возьмем для примера команды копирования и сложения:
MOV АХ.ВХ ADD СХ.20
Первые операнды в этих командах являются приемниками, а вторые - источниками. (Их очередность не принципиальна; она с тем же успехом могла бы быть обратной.) Очевидно, что в таком случае приемник является левым значением, то есть в этом месте должно располагаться перезаписываемое значение. Следовательно, целевые операнды, в отличие от исходных, не могут быть константами.
В первоначальном проектном решении 8088 один из операндов в случае, если в команде их два, обязательно должен был быть регистром. Предполагалось, что это требование позволит различать команды обработки байтов и слов, исходя из того, является ли адресуемый регистр регистром для байтов или для слов. В первой версии процессора это правило соблюдалось с неимоверной строгостью. Невозможно было даже ввести в стек константу, поскольку в таком случае ни в одном из двух операндов команды не было бы ни одного регистра. В последующих версиях ограничения были смягчены, но сам принцип оказал определенное влияние на конструктивное решение процессора. В некоторых случаях один из двух операндов не упоминается. Например, в команде MULB роль приемника может выполнять только регистр АХ.
Существуют также команды с одним операндом. В эту категорию входят, помимо прочего, команды приращения, сдвига и сброса. В этих командах требование о применении регистра в качестве операнда не действует, и различать команды обработки байтов и слов можно только по кодам операций (то есть типам команд).
Процессор 8088 поддерживает четыре базовых типа данных: байт, слово (2 байта), длинное слово (4 байта) и двоично-десятичное число, в котором в слово упаковываются 2 десятичные цифры. Последний тип не поддерживается интерпретатором.
Адрес в памяти всегда соответствует байту, но в случае с обычным или длинным словом также присутствует неявное указание на ячейки памяти, находящиеся непосредственно над указанным байтом. К примеру, слово, расположенное по адресу 20, занимает ячейки памяти 20 и 21. Длинное слово по адресу 24 занимает ячейки 24, 25, 26 и 27. Процессор 8088 является системой с обратным порядком следования байтов (little endian); это означает, что часть слова меньшего порядка хранится по младшему адресу. В стековом сегменте слова должны размещаться по четным адресам. Комбинация АХ DX, где в АХ содержится слово меньшего порядка, является единственно возможным вариантом размещения длинных слов в регистрах процессора 8088.
В табл. В.1 представлены все предусмотренные в 8088 режимы адресации. Далее мы вкратце их рассмотрим. В верхних строках таблицы перечислены регистры. Они могут быть задействованы в качестве источников или приемников практически во всех командах. Имеются 8 регистров для слов и столько же для байтов.
Таблица В.1. Режимы адресации операндов (символ # означает численное значение или метку)
|
Режим адресации
|
Операнд
|
Примеры
|
|
Регистровая адресация
|
|
|
|
По регистру для байтов
|
Регистр для байтов
|
АН, А1_, ВН, ВЦ СН, СЦ РН, Р1_
|
|
По регистру для слов
|
Регистр для слов
|
АХ, ВХ, СХ, РХ, БР, ВР, ві, РІ
|
|
Адресация сегментов данных
|
|
|
|
Непосредственная адресация
|
Адрес после кода операции
|
(#)
|
|
Косвенная регистровая адресация
|
Адрес в регистре
|
(БІ), (01), (ВХ)
|
|
Регистровая адресация со смещением
|
Адрес формируется по значению регистра со смещением
|
#(51), #(01), #(ВХ)
|
|
Индексная регистровая адресация
|
Адрес формируется путем сложения ВХ с БІ/РІ
|
(ВХНвІ), (ВХ)(01)
|
|
Индексная регистровая адресация со смещением
|
ВХ плюс БІ РІ плюс смещение
|
#(ВХ)(51), #(ВХ)(01)
|
|
Адресация стекового сегмента
|
|
|
|
Косвенная адресация по указателю базы
|
Адрес в регистре
|
(ВР)
|
|
Смещение указателя базы
|
Адрес формируется по значению ВР и смещения
|
#(ВР)
|
|
Адресация по указателю базы с индексом
|
Адрес формируется путем сложения ВР и БІД)!
|
(ВРКві), (ВР)(оі)
|
|
Смещение индекса указателя базы
|
ВР плюс БІ/РІ плюс смещение
|
#(ВР)(81), #(ВР)(01)
|
|
Непосредственная адресация данных
|
|
|
По непосредственному байту/слову
|
Информационная часть команды
|
#
|
|
Неявная адресация
|
|
|
|
Команда введения в стек или выталкивания из стека
|
Косвенный адрес (БР)
|
ривн, РОР, ривнг, РОРР
|
|
Флаги загрузки или сохранения
|
Регистр с флагами состояния
|
\JKHF, ЭТС, С1С, СМС
|
Продолжение &
Таблица В.1 (продолжение)
|
Режим адресации
|
Операнд
|
Примеры
|
|
Трансляция хи\Т
|
AL, ВХ
|
XLAT
|
|
Повторяющиеся строковые
|
(SI), (Dl), (СХ)
|
MOVS, CMPS, SCAS
|
|
команды
|
|
|
|
Входные и выходные
|
АХ, AL
|
IN #, OUT #
|
|
команды
|
|
|
|
Преобразование байта, слова
|
AL, AX, DX
|
CBW.CWD
|
В строках под заголовком "Адресация сегмергтов данных" перечислены режимы адресации, актуальные для сегментов данных. Адреса этого типа всегда заключаются в пару круглых скобок - именно они позволяют отличить адрес в их составе от значения иного типа. Простейшим режимом адресации из этой категории является непосредственная адресация, при которой адрес данных операнда включается в команду. Пример:
ADD СХ.(20)
В данном случае к регистру СХ прибавляется содержимое слова памяти, расположенного по адресам 20 и 21. В языке ассемблера ячейки обычно выражаются метками, а не численными значениями, а преобразование выполняется уже в период ассемблирования. Даже в командах CALL и JMP целевой операнд можно сохранить в ячейке памяти, на которую указывает метка. Скобки вокруг меток совершенно необходимы (по крайней мере, для того ассемблера, о котором мы ведем речь), поскольку следующая команда тоже имеет право на существование:
ADD СХ.20
Однако эта команда выражает совершенно другую операцию, а именно - прибавление к значению регистра СХ константы 20, а не содержимого слова памяти, находящегося по адресу 20. Символ # в табл. В.1 может обозначать численную константу, метку или константное выражение с меткой.
При косвенной регистровой адресации адрес операнда хранится в одном из трех регистров: ВХ, SI или DI. Во всех этих случаях он оказывается в сегменте данных. Кроме того, можно разместить константу перед регистром, и в этом случае адрес устанавливается путем сложения регистра с константой. Этот тип адресации, называемый регистровой адресацией со смещением, удобен при обработке массивов. Так, если регистр SI содержит значение 5, то пятый символ строки, определяемой меткой FORMAT, можно загрузить в регистр AL посредством оператора
MOVB AL.FORMAT(SI)
При этом просмотр всей строки осуществляется на каждом этапе путем положительного или отрицательного приращения значения регистра. При использовании операндов-слов значение регистра каждый раз изменяется в ту или иную сторону на 2.
Кроме того, можно поместить базу (то есть нижний числовой адрес) массива в регистр ВХ, сохранив регистры SI или DI для отсчета. Такая схема называется индексной регистровой адресацией. Пример:
PUSH (ВХ)(DI)
Этот код извлекает содержимое ячейки из сегмента данных с адресом, который определяется суммой регистров ВХ и DI. Результирующее значение затем помещается в стек. Сочетание последних двух типов адресации дает индексную регистровую адресацию со смещением:
NOT 20(BX)(DI)
Эта команда обращается к слову памяти по адресам ВХ + DI + 20 и ВХ + DI + 21.
Все способы косвенной адресации, применимые к сегменту данных, актуальны и для стекового сегмента; в последнем случае базовый регистр ВХ заменяется указателем базы В Р. Таким образом, (ВР) - это только режим косвенной адресации стека регистров, однако существуют и более сложные режимы, в частности, косвенная адресация по указателю базы с индексом и смещением: ?1(BP)(SI). Эти режимы полезны при обращении к локальным переменным и параметрам функций, хранящихся по адресам стека в подпрограммах. Соответствующая схема описывается в подразделе "Вызовы подпрограмм".
Все адреса, соответствующие перечисленным режимам адресации, в операциях могут выступать в качестве как источников, так и приемников. Взятые вместе, эти две категории называются действительными адресами. Режимы адресации двух оставшихся категорий не предполагают наличие приемников, поэтому соответствующие адреса не входят в число действительных. Они применяются только в качестве источников.
Режим адресации, при котором операндом является константный байт или значение слова, называется непосредственной адресацией. Например:
СМР АХ,50
Эта команда сравнивает значение в регистре АХ с константой 50 и в зависимости от результата устанавливает биты во флаговом регистре.
Наконец, некоторые команды используют неявную адресацию. В таких командах операнд или операнды лишь подразумеваются. К примеру:
PUSH АХ
Эта команда вводит содержимое регистра АХ в стек; для этого она уменьшает значение SP на единицу, а затем копирует содержимое АХ в ячейку, на которую теперь указывает SP. При этом регистр SP в команде не упоминается. Аналогичным образом, регистр флагов состояния не упоминается в командах управления флагами. Неявные операнды применяются и в других командах.
В процессоре 8088 предусмотрены специальные команды для перемещения (M0VS), сравнения (CMPS) и просмотра (SCAS) строк. После выполнения этих строковых команд содержимое индексных регистров SI и DI автоматически обновляется. Этот механизм называется, в зависимости от направления, автоинкрементным или автодекрементным режимом. Направление приращения (положительное или отрицательное) регистров SI и DI определяется флагом направления в регистре флагов состояния. Флаг направления с нулевым значением определяет положительное приращение, а флаг с единичным значением - отрицательное. Величина приращения составляет 1 в командах для байтов и 2 в командах для слов. В некотором смысле указатель стека также имеет отношение к автоинкрементному и автодекрементному режимам: его значение уменьшается на 2 в начале операции PUSH и увеличивается на 2 по окончании операции POP.
⇐Организация памяти и сегменты || Оглавление || Набор команд 8088⇒
|