1байт, если необходим |
До 4 префиксов по 1 байту каждый |
1,2 или 3 байта |
1байт, если необходим |
1,2 или 4 байта или отсутствует |
1,2 или 4 байта или отсутствует |
Префикс команды |
Код операции |
Mod R/M |
SIB |
Смещение |
Непосредственное |
Рисунок 6 – Формат команды
Поля Mod R/M и SIB (пост-байт) – определяют тип адресации
7 6 |
5 3 |
2 0 |
Mod |
Reg/OpCode |
R/M |
Рисунок 7 – Формат байта Mod R/M
Поля Mod и R/M – формируют 32 типа адресации: 8 регистровых и 24 типа обращений к памяти
Поле Reg/OpCode – определяет либо один из регистров, либо в нем хранится дополнительные 3 бита кода операции
Поле R/M может определять либо регистр как операнд, либо использоваться в комбинации с полем Mod для определения типа адресации.
Поля SIB используются для формирования линейного адреса.
Рисунок 8 – Схема формирования адреса операнда
Поле Scale (символ S) – 2 бита (7 и 6)
Поле Index (символ I) – 3 бита (5, 4 и 3)
Поле Base (символ B) – 3 бита (2, 1 и 0)
Способы адресации основаны на различных вариациях полей Mod R/M и SIB:
Непосредственная – в команде указывается само значение операнда
Mov ax,0ffffh– где Mov – мнемоника команды перемещения данных
Ax – название регистра-приемника данных
0ffffh – непосредственно значение, записываемое в регистр. Значение всегда начинается с цифры. Для шестнадцатеричных чисел, начинающихся с символа необходимо вначале ставить цифру 0. Символ в конце числа означает систему счисления, в которой представлено число, по умолчанию все числа принимаются десятичными. «h» – 16 с/с, «O» – 8 c/с, «b» – 2 с/с.
Регистровая – в команде указываются имена регистров, являющихся источником и приемником данных. Некоторые команды (умножения и деления) хранят операнды не в одном, а в паре регистров (в результате умножения получается слово двойной длины, а делимое должно быть длиннее делителя в 2 раза), при этом пара регистров разделяется двоеточием: EDX:EAX, где старшие 32 разряда в EDX, а младшие – в EAX.
Mov ax,bx; где AX – регистр-приемник данных, а ВХ – регистр-источник данных