Как же адресная информация передается микропроцессору в машинном
языке? 8088 использует почти для всех операций адресации байт
MOD-R/M (байт режима адресации и регистра/модификатора - прим.
перев.). Фиг.3.4 показывает формат этого байта команды. Байт
MOD-R/M следует за байтом кода операции и определяет один операнд
памяти команды 8088. Этот байт может вместо ячейки памяти указывать
и регистр. Такое единство структуры позволяет реализовать все
возможности адресации операндов.
ЪДДДДДДДВДДДДДДДДДДДВДДДДДДДДДДДї
і і і і
АДДДБДДДБДДДБДДДБДДДБДДДБДДДБДДДЩ
Режим Заданная Регистр-
команда модификатор
Режим Смещение
-------------------------------------------------
00 DISP=0, нет байтов смещения
01 -128<DISP<127, однобайтовое смещение
10 -32768<DISP<32767, двухбайтовое смещение
11 В поле r/m - регистр, а не адрес
Фиг. 3.4 Байт режима адресации и регистра-модификатора
Первые два бита байта MOD-R/M определяют выбранный способ ад-
ресации. Эти два бита определяют число байт смещения, которые
следуют за байтом MOD-R/M - ни одного, один или два. Последние 3
бита байта MOD-R/M определяют вид адреса - одну из восьми комбина-
ций базисных и индексных регистров. Это поле называется полем R/M -
полем регистра/модификатора. Это те самые 3 бита из колноки R/M на
Фиг.3.3, где показаны возможные комбинации при адресации. Значение
оставшихся 3-х бит в середине байта MOD-R/M зависят от конкретной
команды. Для команды с двумя операндами, вроде ADD, это поле
указывает регистр, являющийся вторым операндом. Для команды с одним
операндом, как INC, эти три бита обычно составляют часть самого
кода операции. 8088 не знает, что имеет дело с командой INC, пока
не расшифрует средние три бита байта MOD-R/M.
Этот же байт используется еще в паре специальных случаев. Если
в команде определен регистр, а не адрес памяти, то в поле режима
помещается код 11B, чтобы сообщить микропроцессору, что поле R/M
содержит код регистра, а не адрес памяти. Наконец, вы возможно
заметили, что в механизме работы с байтом MOD-R/M не предусмотрена
прямая адресация. 8088 рассматривает как прямую адресацию случай
типа [BP + СМЕЩЕНИЕ] при нулевом смещении. В этом случае поле
смещения имеет длину два байта, и в вычислении адреса не участвует
ни один регистр. Из-за этого особого случая доступ к ячейке памяти,
на которую указывает регистр BP, в машинном коде требуется
однобайтовое поле смещения с нулевым значением. Использование в той
же ситуации регистров BX, SI и DI не требует байта смещения. В
следующем пункте будет показано еще одно различие между адресацией
через регистры BP и BX.