Реклама:

Для выполнения абсолютного большинства команд требуются данные, которые извлекаются либо из памяти, либо из регистров. Для именования этих данных в 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