Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ассемблер.doc
Скачиваний:
24
Добавлен:
25.08.2019
Размер:
526.34 Кб
Скачать

3.8. Байт mod r-m

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

3.9 Физическая адресация

Все, что до сих пор говорилось об адресации, относится к генерации так называемого смещения (offset) адреса. Смещение имеет 16-битовое значение. 8088 сегментирует память таким образом, что можно адресоваться к памяти большей чем 64K. В этом пункте булет показан способ сегментации 8088. Поскольку размер слова в микропроцессоре 8088 равен 16 бит, для него естественно генерировать адреса в 16бит длиной. Это делает доступными дляпрямой адрессации 2**16 элементов или 65 535 байт памяти. Однако для некоторых программ 64K ячеек памяти недостаточно. Поэтому фирма INTEL сконструировала 8088 для адресации 2**20 байт или одного мегабайта памяти. Для получения 20-битовой адресации требуется еще четыре бита к имеющимся 16-ти. Добавочные 4 бита адресной информации берутся из сегментных регистров. Сегментные регистры сами имеют размер 16 бит. 8088 комбинирует 16-битовый адрес смещения и 16-битовый регистр сегмента как показано на Фиг.3.5. Процессор дополняет сегментный регистр 4-мя нулевыми битами, что составляет вместе полное 20-битовое значение. К расширенному значению сегмента процессор добавляет адрес смещения, определяемый через вычисление адреса. 20-битовый результат является указателем на исполнительный адрес.

Сегмент * 16 + Смещение = 20-битовый адрес

Фиг.3.5 Вычисление адреса с сегментом и смещением

Каждая обращающаяся к памяти команда может сформировать только 16-битовый адрес операнда. В действительности процессор применяет этот адрес внутри определенного сегмента. Фиг. 3.6 иллюстриирует такой способ применения сегментации.

Сегмент

смещение

xxxx xxxx 0000

0000

 

....

 

FFFF

yyyy yyyy 0000

0000

 

....

 

FFFF

     Фиг.3.6 Сегментация.

Начальный адрес сегмента всегда имеет нули в младших четырех битах. Адрес с этим свойством имеет каждая шестнадцатая ячейка памяти. Конструируя расположение данных в своей программе помните, что сегмент всегда должен приходиться на такую 16-битовую границу. Эти границы называются также границами параграфов

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]