Все коды байта 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-битные регистры.
Код | 32 | 16 | 8 |
|
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 |
Множитель |
1 | 2 |
4 | 8 |
В некоторых источниках встречается требование, что при значении
( index = 100 ) должно быть ( scale = 00 ).
Все страницы справочника
Самые последние новые страницы, добавленные в справочник, могут
отсутствовать в этом списке. Но все новые страницы заведомо
есть в списке на главной странице.
Главная страница
Справочник по командам процессоров x86
(здесь карта всех страниц справочника)
Основные большие таблицы
Все команды по алфавиту (кратко)
Все команды по алфавиту (подробно)
Первый байт кода операций
Второй байт кода операций
Пояснения к основным таблицам
Структура машинной команды
Структура машинной команды
Байты MRM и SIB - формы адресации
Все коды байта MRM (16 бит)
Все коды байта MRM (32 бит)
Все коды байта SIB
Команды по группам
Основная арифметика
Инкремент и декремент
Пересылка данных
Работа со стеком
Условные команды
Переходы и процедуры
Умножение и деление
Команды сдвига
Цепочечные команды
Работа с битами
Десятичная арифметика
Установка флажков
Сегментные регистры
Специальные команды
Разные заметки
Регистры общего назначения
Коды сегментных регистров
Команды ассемблера и машинные команды
Группа команд 80, 81, 82, 83
Команды сравнения кодов