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

经典变长指令-SIB

一、回顾Mod/M结构

Intel 64 and IA-32 Architectures Instruction Format
image
SIB由ModR/M来决定,同时Displacement(偏移)和Immediate(立即数)也是由ModR/M来决定

二、SIB的组成部分(结构图)

image
image

三、示例

88 84 48

1、88-->是Opcode,查Table A-2表-->得出操作指令是MOV
2、88的具体含义为-->MOV Eb,Gb
image
3、见到 Eb,Gb明白84为ModR/M字段
4、接下来来拆分ModR/M-->10 000 100 (按照ModR/M结构图来进行查询(可看上一篇文章)
5、接下来查表Table2-2
image
6、发现得到的与之前有所不同,当遇到[--][--]这种情况仅依靠ModR/M无法来确定,需要继续查询SIB
7、此时为通过ModR/M确定成-->[--][--]+disp32,接下来通过中间的000位确定Gb,因为此时的宽度为b所以是8个字节,所以为AL
image
8、通过以上确定了48为SIB的结构(组成部分和格式可看第二部分) 将48拆分-->01 001 000,然后查表Table 2-3-->Base为EAX,Index为ECX*2
image
9、最后补全-->MOV BYTE PTR DS:[EAX + ECX*2 +disp32],AL disp32是偏移的值而且宽度为32,就说明,在使用的时候后面会被吃进去4个字节
image

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