movss操作码需要如何解释?

问题描述 投票:0回答:1

我在 Visual Studio IDE 的调试器上从 C++ 构建中获得了此反汇编代码:

就我在movss指令中看到的内容来说,应该是

  1. F3 0F 10 /r MOVSS xmm1, xmm2 -- 将 xmm2 中的标量单精度浮点值合并到 xmm1 寄存器。
  2. F3 0F 10 /r MOVSS xmm1, m32 - 将标量单精度浮点值从 m32 加载到 xmm1 寄存器。
  3. F3 0F 11 /r MOVSS xmm2/m32, xmm1 -- 将标量单精度浮点值从 xmm1 寄存器移至 xmm2/m32。

所以,虽然前 3 个字节很容易理解,但我不太理解其余的,例如第一行的

05 6b 02 10 00
,第二行的
44 24 38
,依此类推。

你能帮我理解它们吗? 05或44好像是/r?是什么意思?

c++ assembly disassembly
1个回答
3
投票

您将需要英特尔® 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

© www.soinside.com 2019 - 2024. All rights reserved.