X86: `movsxd rdx,edx` 指令是啥意思?
Posted
技术标签:
【中文标题】X86: `movsxd rdx,edx` 指令是啥意思?【英文标题】:X86: What does `movsxd rdx,edx` instruction mean?X86: `movsxd rdx,edx` 指令是什么意思? 【发布时间】:2019-06-12 15:16:20 【问题描述】:我一直在玩 intel mpx,发现它添加了一些我无法理解的指令。例如(intel 格式):
movsxd rdx,edx
我找到了this,它谈到了类似的指令 - MOVSX
。
从那个问题来看,我对这条指令的解释是,它需要双字节(这就是为什么在 movsxd
中有一个 d
)并将其复制到 rdx
寄存器中(在两个最低有效字节中)和用那个双字节的符号填充其余部分。
我的解释是否正确(我认为我错了)?如果不能,请告诉我这是怎么回事?
【问题讨论】:
是的。这只是从 32 位到 64 位的有符号转换。 顺便说一句,d
当然不是“双字节”,它是双 字。此外,我猜您知道edx
是rdx
的低32 位,因此在这种情况下不会发生复制,这些位会保留在原处。只有前 32 位用符号填充。另请参阅官方 intel 指令集参考文档,以及众所周知的online conversion。
是的,在您发表第一条评论后,这对我来说非常有意义,我意识到我的错误。非常感谢您的回答和链接。
遇到未知指令时务必检查指令集参考。
谢谢@fuz,我会记住的
【参考方案1】:
您的代码是 64 位的。如果您查看MOVSXD
的指令集架构 (ISA) 手册,64 位变体定义为:
MOVSXD r64, r/m32 Move doubleword to quadword with sign-extension.
这是 64 位代码中的指令,它将 32 位寄存器或地址转换为 32 位值并将其符号扩展移动到 64 位寄存器中。符号扩展是获取源的最高位(符号位)的值,并使用它来填充目标的所有高位。
movsxd rdx,edx
查看 EDX 的第 31 位(最高位)并将目标的高 32 位设置为该值并按原样复制低 32 位。如果 EDX 中的符号位被设置,则 64 位寄存器的高 32 位将被设置为 1。如果符号位被清除,则 RDX 的高 32 位将是 0。
例如,假设 EDX 的值为 0x80000000
。第 31 位为 1。作为有符号数,即 -2147483648
。如果您执行 movsxd RDX, EDX
,则 RDX 中的值将是 0xFFFFFFFF80000000
。作为一个有符号的 64 位值,仍然代表 -2147483648
。
如果 EDX 是 0x7fffffff
(有符号值 +2147483647
)且第 31 位为 0,则 RDX 中的值将是 0x000000007fffffff
,它仍然表示签名号码+2147483647
。如您所见,符号扩展在更宽的寄存器的高位上保留符号位,以便保留目标的符号性。
【讨论】:
更有趣的是movsxd r16, r/m16
又名 63 /r
没有 REX.W
(和 32 位版本)的存在。需要一种新的编码,但谁知道他们为什么更改指令名称,毕竟通过在 movsx eax, ax
之前添加一个操作数大小覆盖前缀可以创建 movsx ax, ax
,所以它不像任何新东西。 ?
@MargaretBloom:我想知道 AMD 是否出于文档目的创建了一个单独的助记符,以便他们可以将其与 386+ movsx
分开列出?或者作为 AMD64 的新指令/操作码更改列表的一部分?但是,是的,现在一些汇编程序不接受movsx rax, edx
或movsx rax, dword [rdi]
并强迫您用双字操作数大小写出movsx 的movsxd
助记符,这是毫无意义的不便。为不同的源大小选择 2 个而不是 3 个操作码似乎不是问题。现在唯一的借口是它比 movsx
短(1 字节 vs 2)
@MargaretBloom:或者 AMD 希望你能够在没有操作数大小说明符的情况下编写 movsxd rax, [rdi]
。 (有趣的事实:根据我几年前写的答案,YASM 总是需要dword
:yasm movsx, movsxd invalid size for operand 2。)
@PeterCordes 是的,可能 AMD 与此有关 :) NASM 在这方面似乎有点落后(至少我的版本有点旧),例如它不支持 @987654347 @,即使在拆卸时也不行。以上是关于X86: `movsxd rdx,edx` 指令是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章
指令系统-第三节2345:常用的x86汇编指令选择和循环语句的机器级表示
x86 程序集:“subl”命令如何在 AT&T 语法中工作