<<
>>

Адресация

Для выполнения абсолютного большинства команд требуются данные, которые извлекаются либо из памяти, либо из регистров. Для именования этих данных в 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. Режимы адресации операндов (символ # означает численное значение или метку)
Режим адресации Операнд Примеры
Регистровая адресация По регистру для байтов Регистр для байтов АН, AL, ВН, ВЦ СН, СЦ DH, DL
По регистру для слов Регистр для слов АХ, ВХ, СХ, DX, SP, ВР, SI, DI
Адресация сегментов данных Непосредственная адресация Адрес после кода операции (#)
Косвенная регистровая адресация Адрес в регистре (SI), (DI), (ВХ)
Регистровая адресация со смещением Адрес формируется по значению регистра со смещением #(SI), #(DI), #(ВХ)
Индексная регистровая адресация Адрес формируется путем сложения ВХ с 51/Р1 (BX)(SI), (BX)(DI)
Индексная регистровая адресация со смещением

Адресация стекового сегмента

ВХ плюс в! Р1 плюс смещение #(BX)(SI), #(BX)(DI)
Косвенная адресация по указателю базы Адрес в регистре (BP)
Смещение указателя базы Адрес формируется по значению ВР и смещения #(BP)
Адресация по указателю базы с индексом Адрес формируется путем сложения ВР и 51Д)1 (BP)(SI), (BP)(DI)
Смещение индекса указателя базы ВР плюс 51/Р1 плюс смещение #(BP)(SI), #(BP)(DI)
Непосредственная адресация данных
По непосредственному байту/слову Информационная часть команды #
Неявная адресация

Команда введения в стек или выталкивания из стека

Косвенный адрес (вР) PUSH, POP, PUSHF, POPF
Флаги загрузки или сохранения Регистр с флагами состояния LAHF, STC, CLC, CMC
Таблица В.1 (продолжение)
Режим адресации Операнд Примеры
Трансляция XLAT AL, ВХ XLAT
Повторяющиеся строковые команды (SI), (DI), (СХ) MOVS, CMPS, SCAS
Входные и выходные команды АХ, AL IN #, OUT #
Преобразование байта, слова AL, АХ, DX CBW,CWD

В строках под заголовком «Адресация сегментов данных» перечислены режимы адресации, актуальные для сегментов данных. Адреса этого типа всегда заключаются в пару круглых скобок — именно они позволяют отличить адрес в их составе от значения иного типа.

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

ADD СХ.(20)

В данном случае к регистру СХ прибавляется содержимое слова памяти, расположенного по адресам 20 и 21. В языке ассемблера ячейки обычно выражаются метками, а не численными значениями, а преобразование выполняется уже в период ассемблирования. Даже в командах CALL и JMP целевой операнд можно сохранить в ячейке памяти, на которую указывает метка. Скобки вокруг меток совершенно необходимы (по крайней мере, для того ассемблера, о котором мы ведем речь), поскольку следующая команда тоже имеет право на существование:

ADD СХ.20

Однако эта команда выражает совершенно другую операцию, а именно — прибавление к значению регистра СХ константы 20, а не содержимого слова памяти, находящегося по адресу 20. Символ # в табл. В.1 может обозначать численную константу, метку или константное выражение с меткой.

При косвенной регистровой адресации адрес операнда хранится в одном из трех регистров: ВХ, SI или DI. Во всех этих случаях он оказывается в сегменте данных. Кроме того, можно разместить константу перед регистром, и в этом случае адрес устанавливается путем сложения регистра с константой. Этот тип адресации, называемый регистровой адресацией со смещением, удобен при обработке массивов. Так, если регистр SI содержит значение 5, то пятый символ строки, определяемой меткой FORMAT, можно загрузить в регистр AL посредством оператора

M0VB AL.FORMAT(SI)

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

Кроме того, можно поместить базу (то есть нижний числовой адрес) массива в регистр ВХ, сохранив регистры SI или DI для отсчета. Такая схема называется индексной регистровой адресацией. Пример:

PUSH (ВХ)(DI)Этот код извлекает содержимое ячейки из сегмента данных с адресом, который определяется суммой регистров ВХ и DI.

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

NOT 20(ВХ)(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.

<< | >>
Источник: Таненбаум Э.. Архитектура компьютера. 5-е изд. 2007

Еще по теме Адресация:

  1. § 7. Правоотношения из объявления публичного конкурса (п. 2543-2552)
  2. 2. Правовая охрана товарного знака (знака обслуживания)
  3. Это пишется иначе
  4. Л.О. Доліненко, В.О. Доліненко, С.О. Сарновська. Цивільне право України, 2006
  5. ЦИВІЛЬНЕ ПРАВО УКРАЇНИ
  6. ПЕРЕДМОВА
  7. Частина І ПРОГРАМА КУРСУ «ЦИВІЛЬНЕ ПРАВО УКРАЇНИ»
  8. Розділ І. Загальні положення цивільного права
  9. Тема 1. Поняття цивільного права. Предмет та метод, система цивільного права. Функції та принципи цивільного права
  10. Тема 2. Цивільне законодавство України
  11. Тема 3. Поняття, елементи та види цивільних правовідносин
  12. Тема 4. Здійснення цивільних прав і виконання обов’язків