{ codeImgUrl : '', // >= v1.1.5 左侧图片设置,不配置使用 window.cnblogsConfig.blogAvatar aboutHtml : '', // 关于博主,不配置使用默认 copyrightHtml: '', // 版权声明,不配置使用默认 supportHtml : '', // 声援博主,不配置使用默认 }

经典变长指令-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部分,即寄存器
image
Mod(第6,7位)和R/M(第0、1、2位)共同描述指令中的E部分,即寄存器/内存
image

二、计算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]

posted @ 2022-01-09 14:15  Mkd1R  阅读(705)  评论(0)    收藏  举报