【2021.01.09】经典变长指令-SIB

有没有SIB是由ModR/M决定的。

SIB结构

例如:88 84 48,查表并拆分可得:

88:是Opcode,所以查TableA-2表,得:MOV Eb, Gb。

84:拆成二进制可得:10 000 100,查Table2-2表。MOD是10,RM是100,发现是:[--][--]+disp32。如果遇到这种格式,说明当前指令通过ModR/M没有办法确定,必须要再用ModR/M后面再跟一个字节,这个字节就是SIB。Gb通过中间的000来确定,如果当前宽度是4字节就是EAX,8字节是AL。当前宽度是b,8字节,所以是AL。变成了:MOV [--][--]+disp32, AL。

由于有SIB,所以继续向后拆48。

48:拆成二进制可得:01 001 000,查Table2-3表。Base查表得:EAX,然后通过Scale和Index查表得:[ECX * 2]。

最终可得:MOV [EAX + ECX * 2 + disp32], AL、MOV BYTE PTR DS:[EAX + ECX * 2 + disp32], AL

发现还有一部分没有确定:disp32,当我们使用这个硬编码时它一定会补充4个字节,放到disp32的位置:

猜你喜欢

转载自blog.csdn.net/qq_18120361/article/details/112414585