FE23  LOOCH  DISASM

СПРАВОЧНИК  ПО  КОМАНДАМ
ПРОЦЕССОРОВ  x86

(empty)
Главная Загрузка Инструкция Команды x86 Карта сайта

 

БАЙТ  MRM  И  БАЙТ  SIB
ФОРМЫ  АДРЕСАЦИИ


Содержание


О том, что такое байты MRM и SIB и зачем они бывают нужны в машинной команде посмотрите сначала на странице   Структура машинной команды.

Короткие таблицы, приведенные ниже, позволяют разобраться с кодировкой для байта MRM и для байта SIB и построить вручную формы адресации по имеющимся кодам или, наоборот, вручную определить код для некоторой формы представления адреса.

В справочнике имеются также длинные таблицы, содержащие все возможные коды байта MRM и байта SIB. Эти таблицы позволяют обойтись без хлопотной возни вручную с нуликами и единичками.

 
Все коды байта MRM (16 бит)
Все коды байта MRM (32 бит)
Все коды байта SIB


Формы и режим адресации - основные принципы

Байт MRM ( mod,reg,r/m ) определяет то место, где находятся данные, используемые при выполнении операции. Данные могут находиться либо в регистрах общего назначения, либо в оперативной памяти. Чтобы работать с памятью, требуется знать адрес в памяти. Задать этот адрес можно разными способами, применяя разные формы адресации.

С помощью байта MRM может задаваться либо один операнд, либо два операнда, это зависит от кода операции.

Если задается только один операнд, то он может находиться либо в регистре, либо в памяти, все задается в полях ( mod ) и ( r/m ) байта MRM, причем для памяти задается еще форма и режим адресации.

Если в байте MRM задаются два операнда, то один из операндов может быть только в регистре и этот регистр задается в поле ( reg ), а другой операнд может быть как в регистре, так и в памяти и задается он в полях ( mod ) и ( r/m ).

Если двухбитное поле ( mod = 11 ), то поле ( r/m ) определяет один из восьми регистров. Если поле ( mod ) имеет другое значение (00, 01, 10), то поле ( r/m ) совместно с полем ( mod ) определяет форму и режим адресации памяти.

С появлением 32-битных процессоров, формы адресации памяти существенно изменились. И теперь существуют формы для режима "16 бит" и формы для режима "32 бита", которые совершенно не совпадают. Но при этом назначение битовых полей в байте MRM осталось прежнее. И по-прежнему при ( mod = 11 ) поле ( r/m ) задает регистр.

В режиме "32 бита" в машинной команде сразу после байта MRM может появиться еще и второй байт режима адресации - байт SIB ( scale,index,base ). Байт SIB добавляется в том случае, когда в байте MRM поле ( mod ) имеет одно из значений - 00, 01, 10, а поле ( r/m = 100 ). И тогда конкретную форму адресации определяют три поля байта SIB. Таким образом, общее количество разных форм значительно увеличилось.

Далее здесь мы будем говорить о формах адресации оперативной памяти. И теперь у тех же самых регистров общего назначения будет уже совсем другая роль. Выше мы говорили, что операнд может быть размещен в общем регистре. Теперь те же самые регистры будут упоминаться в качестве индексных регистров.

Итак, форма и режим адресации задают способ вычисления адреса оперативной памяти. Адрес, получаемый в результате вычисления по этой форме, принято называть эффективным адресом (Effective Address - EA).

Под режимом адресации понимается возможность применить либо прямую (direct) адресацию, либо косвенную (indirect). При прямой адресации в команде (в поле для задания адреса) задается непосредственно адрес в оперативной памяти. (Но, говоря точнее, задается все же смещение адреса - относительно адреса начала сегмента).

Напомним, что поле для задания адреса располагается в машинной команде следом за байтом MRM (или за байтом SIB, если в машинной команде имеется байт SIB).

При косвенной адресации адрес памяти задается в каком-нибудь общем регистре. Регистр в таком случае принято называть индексным. Большое количество разных форм адресации возникает из-за того, что для индексации можно использовать любой из восьми регистров общего назначения и даже сразу два разных регистра. Если применяется сразу два регистра, то один из них обычно называют базовым, а другой индексным. Содержимое этих двух регистров суммируется. Кроме того, в форме адресации может быть предусмотрено еще и наличие смещения - относительно адреса, взятого из регистра (или из двух регистров). Смещение адреса размещается непосредственно в команде, все в том же поле для задания адреса.

Смещение может быть задано в полном виде или в сокращенном. Для режима "16 бит" полное смещение занимает два байта, для режима "32 бита" - четыре байта. Если смещение задано в сокращенном виде, то оно занимает в команде только один байт. Тогда при вычислении эффективного адреса оно расширяется (со знаком) до полного - до двух байт или до четырех байт, в зависимости от режима "16/32 бита".

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

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

(Добавление. Однако, все же есть такие команды, в которых для работы с данными задаются сразу два адреса оперативной памяти. это цепочечные команды MOVS и CMPS.)


Коды регистров общего назначения

Здесь приведены коды (двоичные) для регистров общего назначения. Показаны 32-битные, 16-битные, 8-битные регистры.

 Код32168
  000    EAX    AX    AL  
  001    ECX    CX    CL  
  010    EDX    DX    DL  
  011    EBX    BX    BL  
  100    ESP    SP    AH  
  101    EBP    BP    CH  
  011    ESI    SI    DH  
  111    EDI    DI    BH  

Эти коды применяются при задании регистра в поле ( reg ) байта MRM. В тех случаях, когда поле ( r/m ) байта MRM тоже задает регистр, используются эти же коды.

Этой же таблицей можно пользоваться, когда 32-битные регистры задаются в поле ( base ) или в поле ( index ) байта SIB. Но при этом не следует забывать про особенности для значений ( base = 101 ) и ( index = 100 ).


Байт MRM, режим 16 бит

Формы адресации не зависят от значения поля ( reg ) байта MRM.

  r/m    mod     Форма адресации  
  000   00   DS: [BX + SI]
  01   DS: [BX + SI] + disp8
  10   DS: [BX + SI] + disp16
  001   00   DS: [BX + DI]
  01   DS: [BX + DI] + disp8
  10   DS: [BX + DI] + disp16
  010   00   SS: [BP + SI]
  01   SS: [BP + SI] + disp8
  10   SS: [BP + SI] + disp16
  011   00   SS: [BP + DI]
  01   SS: [BP + DI] + disp8
  10   SS: [BP + DI] + disp16
  100   00   DS: [SI]
  01   DS: [SI] + disp8
  10   DS: [SI] + disp16
  101   00   DS: [DI]
  01   DS: [DI] + disp8
  10   DS: [DI] + disp16
  110   00   DS: disp16
  01   SS: [BP] + disp8
  10   SS: [BP] + disp16
  111   00   DS: [BX]
  01   DS: [BX] + disp8
  10   DS: [BX] + disp16

В этой таблице не показан случай ( mod = 11 ), когда поле ( r/m ) задает регистр общего назначения.

Обозначение disp8 означает, что в команде следом за байтом MRM расположен один байт, задающий смещение адреса. Это смещение расширяется (со знаком) до двух байт и добавляется к значению индекса.

Обозначение disp16 означает, что в команде следом за байтом MRM расположены два байта, задающие смещение адреса. Это смещение добавляется к значению индекса.

Для случая, когда ( mod = 00 ) и ( r/m = 110 ), индексный регистр в форме отсутствует, а два байта disp16 задают полный адрес, то есть, смещение относительно начала сегмента. Это прямая адресация памяти (а не косвенная, как во всех других случаях).

Для случая ( r/m = 110 ), форма адресации [ BP ] не может применяться без задания смещения, то есть, при ( mod = 00 ). Если смещение равно нулю, то его все равно нужно явно задавать, используя, например, ( mod = 01 ).

В тех формах адресации, где в качестве индексного регистра выступает регистр BP, сегментом по умолчанию является сегмент SS. Во всех остальных случаях сегментом по умолчанию является сегмент DS.


Байт MRM, режим 32 бита

Формы адресации не зависят от значения поля ( reg ) байта MRM.

  r/m    mod     Форма адресации  
  000   00   DS: [EAX]
  01   DS: [EAX] + disp8
  10   DS: [EAX] + disp32
  001   00   DS: [ECX]
  01   DS: [ECX] + disp8
  10   DS: [ECX] + disp32
  010   00   DS: [EDX]
  01   DS: [EDX] + disp8
  10   DS: [EDX] + disp32
  011   00   DS: [EBX]
  01   DS: [EBX] + disp8
  10   DS: [EBX] + disp32
  100   00   Используется SIB
  01   Используется SIB
  10   Используется SIB
  101   00   DS: disp32
  01   SS: [EBP] + disp8
  10   SS: [EBP] + disp32
  110   00   DS: [ESI]
  01   DS: [ESI] + disp8
  10   DS: [ESI] + disp32
  111   00   DS: [EDI]
  01   DS: [EDI] + disp8
  10   DS: [EDI] + disp32

В этой таблице не показан случай ( mod = 11 ), когда поле ( r/m ) задает регистр общего назначения.

Обозначение disp8 означает, что в команде следом за байтом MRM расположен один байт, задающий смещение адреса. Это смещение расширяется (со знаком) до четырех байт и добавляется к значению индекса.

Обозначение disp32 означает, что в команде следом за байтом MRM расположены четыре байта, задающие смещение адреса. Это смещение добавляется к значению индекса.

Для случая, когда ( mod = 00 ) и ( r/m = 101 ), индексный регистр в форме отсутствует, а четыре байта disp32 задают полный адрес, то есть, смещение относительно начала сегмента. Это прямая адресация памяти (а не косвенная, как во всех других случаях).

Для случая ( r/m = 101 ), форма адресации [ EBP ] не может применяться без задания смещения, то есть, при ( mod = 00 ). Если смещение равно нулю, то его все равно нужно явно задавать, используя, например, ( mod = 01 ).

В тех формах адресации, где в качестве индексного регистра выступает регистр EBP, сегментом по умолчанию является сегмент SS. Во всех остальных случаях сегментом по умолчанию является сегмент DS.


Байт SIB, режим 32 бита

Эта таблица применяется в тех случаях, когда в машинной команде после байта MRM есть байт SIB. Так бывает, если одновременно выполнены следующие условия:

  • действует режим "32 бита",
  • в команде есть байт MRM.
  • поле ( mod ) в байте MRM не равно 11,
  • поле ( r/m ) в байте MRM равно 100.

Если в байте SIB поле ( index = 100 ), то в форме адресации отсутствует член ( scale * index ).

  base    mod     Форма адресации  
  000   00   DS: [EAX] + (scale * index)
  01   DS: [EAX] + (scale * index) + disp8
  10   DS: [EAX] + (scale * index) + disp32
  001   00   DS: [ECX] + (scale * index)
  01   DS: [ECX] + (scale * index) + disp8
  10   DS: [ECX] + (scale * index) + disp32
  010   00   DS: [EDX] + (scale * index)
  01   DS: [EDX] + (scale * index) + disp8
  10   DS: [EDX] + (scale * index) + disp32
  011   00   DS: [EBX] + (scale * index)
  01   DS: [EBX] + (scale * index) + disp8
  10   DS: [EBX] + (scale * index) + disp32
  100   00   SS: [ESP] + (scale * index)
  01   SS: [ESP] + (scale * index) + disp8
  10   SS: [ESP] + (scale * index) + disp32
  101   00   DS: disp32 + (scale * index)
  01   SS: [EBP] + (scale * index) + disp8
  10   SS: [EBP] + (scale * index) + disp32
  110   00   DS: [ESI] + (scale * index)
  01   DS: [ESI] + (scale * index) + disp8
  10   DS: [ESI] + (scale * index) + disp32
  111   00   DS: [EDI] + (scale * index)
  01   DS: [EDI] + (scale * index) + disp8
  10   DS: [EDI] + (scale * index) + disp32

Как правило, в этих формах адресации участвует два регистра. Один задается в поле ( base ) байта SIB, это базовый регистр, другой задается в поле ( index ) того же байта SIB, это индексный регистр.

При значении ( index = 100 ) член ( scale * index ) отсутствует и в форме адресации остается только один базовый регистр.

Если одновременно ( mod = 00 ), ( base = 101 ), ( index = 100 ), то форма задает прямую адресацию памяти.

Если базовым регистром служит регистр EBP, то для него есть форма только со смещением. Если смещение равно нулю, то оно все равно должно явно задаваться.

Поле ( scale ) байта SIB задает множитель к величине индекса. Значение множителя определяется так:

 scale  00  01   10  11 
 Множитель 12 48

В некоторых источниках встречается требование, что при значении ( index = 100 ) должно быть ( scale = 00 ).




Все страницы справочника

Самые последние новые страницы, добавленные в справочник, могут отсутствовать в этом списке. Но все новые страницы заведомо есть в списке на главной странице.

Главная страница

Справочник по командам процессоров x86
      (здесь карта всех страниц справочника)

Основные большие таблицы

Все команды по алфавиту (кратко)
Все команды по алфавиту (подробно)
Первый байт кода операций
Второй байт кода операций
 
Пояснения к основным таблицам

Структура машинной команды

Структура машинной команды
Байты MRM и SIB - формы адресации
 
Все коды байта MRM (16 бит)
Все коды байта MRM (32 бит)
Все коды байта SIB

Команды по группам

Основная арифметика
Инкремент и декремент
Пересылка данных
Работа со стеком
 
Условные команды
Переходы и процедуры
 
Умножение и деление
Команды сдвига
Цепочечные команды
Работа с битами
 
Десятичная арифметика
Установка флажков
Сегментные регистры
Специальные команды

Разные заметки

Регистры общего назначения
Коды сегментных регистров
 
Команды ассемблера и машинные команды
Группа команд 80, 81, 82, 83
Команды сравнения кодов
 


Главная Загрузка Инструкция Команды x86 Карта сайта


 
Copyright (C) FE23 Looch Disasm, 2011
File          - refe05.htm
File created  - 07 Jul 2011
Last modified - 26 Jul 2011
Hosted by uCoz