经典变长指令-ModRM
一、如何计算ModRM
| 0X88 | MOV Eb,Gb | G:通用寄存器 |
|---|---|---|
| 0X89 | MOV Ev,Gv | E:寄存器/内存 |
| 0X8A | MOV Gb,Eb | b:字节 |
| 0X8B | MOV Gv,Ev | v:Word(16位),doubleword(32位),quadword(64位) |
当指令中出现内存操作对象的时候,就需要在操作码后面附加一个字节来进行补充说明,这个字节被称为ModR/M。该字节的8个位被分成了三部分
| 7 ~ 6 | 5~3 | 2~0 |
|---|---|---|
| Mod | Reg/Opcode | R/M |
其中,Red/Opcode(第3,4,5位,共3个字节)描述指令中的G部分,即寄存器

Mod(第6,7位)和R/M(第0、1、2位)共同描述指令中的E部分,即寄存器/内存

二、计算ModRM(案例)
0X88 MOV Eb,Gb-->MOV Eb AL
解释:b表示字节且01换成二进制的3,4,5位为000所以查表可知为AL
88 01 00 000 01-->MOV byte ptr ds:[ecx],al
解释:01换成二进制,分成三部分分别查表,通过6,7和0,1,2为查表可知为ecx
0X89 MOV Ev,Gv-->MOV Eb EAX
89 01 00 000 01-->MOV dword ptr ds:[ecx],EAX
0X8A MOV Gb,Eb-->MOV Gb al
8A 01 00 000 01-->MOV al,byte ptr ds:[ecx]
0X8B MOV Gv,Ev-->MOV EAX Ev
8B 01 00 000 01-->MOV EAX,dword ptr ds:[ECX]


浙公网安备 33010602011771号