我在Visual Studio IDE的编译器上从C++构建中获得了以下编译代码:
x1c 0d1x的数据
对于我在movss指令上看到的,它应该是
- F3 0 F 10 /r MOVSS xmm 1,xmm 2--将xmm 2寄存器中的标量单精度浮点值合并到xmm 1寄存器。
- F3 0 F 10 /r MOVSS xmm 1、m32 -将标量单精度浮点值从m32加载到xmm 1寄存器。
- 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?这是什么意思?
1条答案
按热度按时间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
给出。