Как определить, нужен ли ModR / M через коды операций? - PullRequest
0 голосов
/ 23 марта 2019

Я читаю формат инструкции ia-32 и обнаружил, что ModR/M - это один байт, если требуется, но как определить, требуется ли он, кто-то говорит, что он определяется Opcode, но как? Я хочу знать детали, и есть ли какие-нибудь полезные и авторитетные документы, которые объясняют детали?

1 Ответ

2 голосов
/ 23 марта 2019

Руководство Intel по vol.2 содержит подробности о кодировании операндов для каждой формы каждой инструкции. например взятие только 8-битных версий размера операнда хорошо известной инструкции add, которая имеет 2 формы reg, rm; rm, непосредственная форма; и не-ModRM 2-байтовое сокращение для add al, imm8

Opcode    Instruction    | Op/En |  64-bit Mode | Compat/Leg Mode |  Description
04 ib     ADD AL, imm8   |  I    |   Valid           Valid         Add imm8 to AL.
80 /0 ib  ADD r/m8, imm8 |  MI   |   Valid           Valid         Add imm8 to r/m8.
00 /r     ADD r/m8, r8   |  MR   |   Valid           Valid         Add r8 to r/m8.
02 /r     ADD r8, r/m8   |  RM   |   Valid           Valid         Add r/m8 to r8.

И ниже, таблица кодирования операнда инструкции details подробно описывает, что означают эти коды I / MI / MR / RM из столбца Op / En (кодирование операнда) выше:

Op/En   | Operand 1        | Operand 2     | Operand 3  Operand 4
RM      | ModRM:reg (r, w) | ModRM:r/m (r) |  NA        NA
MR      | ModRM:r/m (r, w) | ModRM:reg (r) |  NA        NA
MI      | ModRM:r/m (r, w) | imm8/16/32    |  NA        NA
I       | AL/AX/EAX/RAX    | imm8/16/32    |  NA        NA

Обратите внимание, что в форме операнда "I" нет упоминания ModRM, поэтому его нет. Но у MI он есть. (С заполнением поля /r /0 из 80 /0 в таблице кодов операций.)

Обратите внимание, что RM и MR отличаются только тем, является ли операнд r / m (который может быть памятью) адресатом или источником.

...