Ф ОРМАТ КОМАНДЫ ПРОЦЕССОРА I NTEL С АРХИТЕКТУРОЙ IA-32
О БЩИЕ СВЕДЕНИЯ О ФОРМАТЕ КОМАНДЫ Префиксы (0-5 байт) Блокировки Замены сегмента Замены длины операнда и длины адреса Повторений Код команды (1-2 байта) Может включать в себя специальные поля регистра, размера операнда, размера непосредственного значения, направления выполнения команды, кода условия Mod R/M (0-1) байт Определяет способ адресации нерегистрового операнда, регистр или дополнительный код операции modR/OR/M
О БЩИЕ СВЕДЕНИЯ О ФОРМАТЕ КОМАНДЫ SIB – Scale-Index-Base Дополнительное поле для адресации в 32-х разрядном режиме. Хранит коэффициент масштаба, номера индексного и базового регистров scaleindexbase Непосредственное значение (0-4 байта) Смещение (0-4 байта). В командах дальних переходов хранится 2 поля – смещение и селектор сегмента
П РЕФИКСЫ
П РИМЕР ФОРМИРОВАНИЯ ПРЕФИКСА ПОВТОРЕНИЯ
П РЕФИКСЫ
П РИМЕР ФОРМИРОВАНИЯ ПРЕФИКСА ЗАМЕНЫ СЕГМЕНТА
П РЕФИКСЫ
П РИМЕР ФОРМИРОВАНИЯ ПРЕФИКСА OS
П РИМЕР ФОРМИРОВАНИЯ ПРЕФИКСА AS
П ОЛЯ КОДА ОПЕРАЦИИ
К ОДЫ РЕГИСТРОВ
К ОДЫ УСЛОВИЙ
Ф ОРМИРОВАНИЕ ПОЛЯ REG
Ф ОРМИРОВАНИЕ ПОЛЯ W
Ф ОРМИРОВАНИЕ ПОЛЯ S
Ф ОРМИРОВАНИЕ ПОЛЯ D
MOV x, dx MOV dx, x
П ОЛЕ КОДА УСЛОВИЙ В КОМАНДАХ УСЛОВНОГО ПЕРЕХОДА
П ОЛЕ MOD R/M modR/OR/M
З НАЧЕНИЕ ПОЛЯ MOD
З НАЧЕНИЕ ПОЛЯ R/O Продолжение кода операции Номер регистра
З НАЧЕНИЕ ПОЛЯ R/M
П РИМЕРЫ ФОРМИРОВАНИЯ M OD R/M CMP EDX, [EBX] MOV AX, ARR[BX]
П ОЛЕ SIB scaleindexbase
З НАЧЕНИЕ ПОЛЯ S (S CALE )
З НАЧЕНИЕ ПОЛЕЙ I (I NDEX ) И B (B ASE )
Ф ОРМИРОВАНИЕ ПОЛЯ SIB ADD EAX,[ESP]
Н ЕПОСРЕДСТВЕННОЕ ЗНАЧЕНИЕ необязательное поле команды, которое может занимать 0, 1, 2 или 4 байта. Размер непосредственного операнда определен несколькими факторами: разрядностью программного сегмента; наличием в команде префикса OS = 66h; значением бита s, который позволяет сохранять в тексте программы только младший байт 16-ти или 32-х битного непосредственного операнда, если его значение попадает в диапазон для короткого целого числа со знаком
С МЕЩЕНИЕ Если в команде используется смещение, то поле mod должно принимать значения 01 или 10. В случае, если mod = 01 используется 8-ми битное смещение, а при mod = 10 – 16-ти или 32-х разрядное смещение. Если в команде используется прямая адресация, то требуется, чтобы поле mod = 00, а поле R/M принимало значение 110 для указания 16- ти разрядного смещения в 16-ти разрядных сегментах, и 101 – для 32-х разрядного смещения в 32-х разрядных сегментах. Использование 32-х или 16-ти разрядного смещения зависит от разрядности сегмента и наличия префикса AS = 67h. В случае, когда разрядность сегмента кода не совпадает с разрядностью сегмента данных, команда обязательно формируется с преaиксом AS, а разрядность смещения устанавливается по разрядности сегмента кода. При использовании индексной адресации через 32-х разрядные регистры без указания регистра базы обязательно формируется 32-х разрядное смещение, даже если оно не было указано. При адресации через 32-х разрядные регистры с использованием регистра базы размер смещения может быть оптимизирован (хранится в виде одного байта), если его значение находится в диапазоне