assembly movss操作码需要如何解释?

km0tfn4u  于 4个月前  发布在  其他
关注(0)|答案(1)|浏览(32)

我在Visual Studio IDE的编译器上从C++构建中获得了以下编译代码:
x1c 0d1x的数据
对于我在movss指令上看到的,它应该是

  1. F3 0 F 10 /r MOVSS xmm 1,xmm 2--将xmm 2寄存器中的标量单精度浮点值合并到xmm 1寄存器。
  2. F3 0 F 10 /r MOVSS xmm 1、m32 -将标量单精度浮点值从m32加载到xmm 1寄存器。
  3. F3 0 F 11 /r MOVSS xmm 2/m32,xmm 1--将标量单精度浮点值从xmm 1寄存器移动到xmm 2/m32。
    所以,虽然前3个字节很容易理解,但我并不真正理解其余的,例如第一行的05 6b 02 10 00,第二行的44 24 38,等等。
    你能帮我理解它们吗?05或44似乎/r?这是什么意思?
pb3skfrl

pb3skfrl1#

您需要 * 英特尔® 64和IA-32架构软件开发人员手册第2卷:指令集参考,A-Z* 中的official pdf version
请参阅章节 ”指令汇总表中的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
对于第二条指令,您将在列xmm0,行[--][--]+disp8中找到44,根据脚注,这意味着:
1 .[--][--]命名法意味着SIB跟随ModR/M字节。
3 . disp 8命名法表示在ModR/M字节(或SIB字节,如果存在的话)之后的8位位移,并且该位移被符号扩展并被添加到索引。
因此,下一个字节是SIB。您可以在 * 表2-3中看到这些。32位寻址格式与SIB字节 *。值24位于列esp,行none。调整为64位,这意味着地址的形式为[rsp + disp8],其位移由以下字节38给出。

相关问题