X86:`movsxd rdx,edx` 指令是什么意思?

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

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

movsxd rdx,edx

我找到了 ,其中谈到了类似的指令 - MOVSX

从那个问题来看,我对这条指令的解释是,它需要双字节(这就是为什么 movsxd 中有一个 d)并将其复制到 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。如果符号位被清除,则 的高 32 位将被设置为 1。 RDX 将为 0.

例如,假设 EDX 的值为 0x80000000。第 31 位为 1。作为有符号数,即 -2147483648。如果你这样做 movsxd RDX, EDX RDX 中的值将是 0xFFFFFFFF80000000 。作为仍然表示 -2147483648.

的有符号 64 位值

如果 EDX0x7fffffff(有符号值 +2147483647),第 31 位为 0,则 RDX 本来是 0x000000007fffffff,它仍然代表带符号的数字 +2147483647。如您所见,符号扩展保留了更宽寄存器高位的符号位,以便保留目标的符号性。