Как же адресная информация передается микропроцессору в машинном языке? 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.