mar*_*zzz 0 assembly x86-64 disassembly
我在 Visual Studio IDE 的调试器上从 C++ 构建中获得了以下反汇编代码:
根据我在movss指令上看到的内容,应该是
因此,虽然前 3 个字节很容易理解,但我不太理解其余的字节,例如05 6b 02 10 00第一行、44 24 38第二行等等。
你能帮我理解它们吗?05或44好像是/r?这是什么意思?
您将需要Intel\xc2\xae 64 和 IA-32 架构软件开发人员手册第 2 卷的官方pdf 版本:指令集参考,AZ。
\n请参阅“3.1.1.1 指令汇总表中的操作码列(没有 VEX 前缀的指令)”一章,其中提到:
\n\n\n/r 表示指令的 ModR/M 字节包含寄存器操作数和 r/m 操作数。
\n
然后查看表2-2。以 ModR/M 字节的 32 位寻址形式,找到值05。它在xmm0列和disp32行中。这意味着将发生 32 位位移。最后见表2-7。RIP-相对寻址,表示disp32已重新调整用途RIP + Disp32以表示 64 位模式。因此,6B 02 10 00反RIP + 0010026B汇编器将其有用(?)解码为7FFB47521775 + 0010026B = 7FFB476219E0
对于第二条指令,您将44在 column xmm0, row中找到[--][--]+disp8根据脚注的含义:
\n\n1. [--][--] 命名法表示 SIB 位于 ModR/M 字节之后。
\n3. disp8 命名法表示 ModR/M 字节(或 SIB 字节,如果存在)之后的 8 位位移,并且经过符号扩展并添加到索引中。
\n
所以下一个字节是 SIB。您可以在表 2-3 中看到这些内容。采用 SIB 字节的 32 位寻址形式。该值24位于列esp、行中none。调整为 64 位,这意味着地址采用 的形式,[rsp + disp8]位移由以下字节给出,即38。
| 归档时间: |
|
| 查看次数: |
73 次 |
| 最近记录: |