assembly - X86 : What does `movsxd rdx,edx` instruction mean?

标签 assembly x86-64 mov

我一直在玩intel mpx,发现它添加了一些我无法理解的指令。例如(英特尔格式):

movsxd rdx,edx

我找到了 this ,它谈到了类似的指令 - MOVSX .

从那个问题,我对这条指令的解释是,它需要双字节(这就是为什么在 d 中有 movsxd 的原因)并将其复制到 rdx注册(在两个最低有效字节中)并用该双字节的符号填充其余部分。

我的解释是否正确(我认为我错了)?如果没有,你能告诉我发生了什么吗?

最佳答案

您的代码是 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 .作为仍然代表 -2147483648 的有符号 64 位值.

如果 EDX 是 0x7fffffff (有符号值 +2147483647 )第 31 位为 0,RDX 中的值应该是 0x000000007fffffff仍然代表有符号数 +2147483647 .正如您所看到的,符号扩展在更宽的寄存器的高位上保留了符号位,以便保留目标的符号性。

关于assembly - X86 : What does `movsxd rdx,edx` instruction mean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56565510/

相关文章:

assembly - addq 与 64 位立即数?

c - 使用共享库时的函数原型(prototype)

c - 内联汇编 - 无用的中间复制指令

C、汇编 x86 - 调用替代方案

c - 查找数组的起始地址

assembly - 英特尔开发人员手册中的 "store-buffer forwarding"是什么意思?

background - 使用 AVCONV 或 FFMPEG 在图像文件上覆盖movie.mov

assembly - 以16位数字作为输入并将其显示在屏幕上

c - 内存写入何时变得全局可见?

video - FFprobe 在非常大的 .mov 文件上报告无效的 sample_count