我在 Visual Studio IDE 的调试器上从 C++ 构建中获得了此反汇编代码:
就我在movss指令中看到的内容来说,应该是
所以,虽然前 3 个字节很容易理解,但我不太理解其余的,例如第一行的
05 6b 02 10 00
,第二行的 44 24 38
,依此类推。
你能帮我理解它们吗? 05或44好像是/r?是什么意思?
您将需要英特尔® 64 和 IA-32 架构软件开发人员手册第 2 卷的官方 pdf 版本:指令集参考,A-Z。
请参阅章节“3.1.1.1 指令汇总表中的操作码列(没有 VEX 前缀的指令)”,其中写道:
/r 表示指令的 ModR/M 字节包含寄存器操作数和 r/m 操作数。
然后查看表2-2。使用 ModR/M 字节 的 32 位寻址形式,找到值
05
。它位于 xmm0
列和 disp32
行。这意味着将发生 32 位位移。最后参见表2-7。 RIP-相对寻址,表示 disp32
被重新定义为 64 位模式下的 RIP + Disp32
。因此, 6B 02 10 00
的意思是 RIP + 0010026B
,它被反汇编程序有效地(?)解码为 7FFB47521775 + 0010026B = 7FFB476219E0
对于第二条指令,您会在
44
行xmm0
中找到[--][--]+disp8
,根据脚注,其含义是:
1 . [--][--] 术语表示 SIB 遵循 ModR/M 字节。
3. disp8 命名法表示 ModR/M 字节(或 SIB 字节,如果存在)后面的 8 位位移,并且经过符号扩展并添加到索引中。
所以下一个字节是SIB。您可以在表 2-3 中看到这些内容。使用 SIB 字节 的 32 位寻址形式。值
24
位于第 esp
行 none
中。调整为 64 位,这意味着地址采用 [rsp + disp8]
的形式,位移由以下字节给出,即 38
。