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

时间:2019-06-12 15:16:20

标签: assembly x86-64 mov

我一直在使用intel mpx,发现它增加了某些我听不懂的说明。例如(采用英特尔格式):

movsxd rdx,edx

我找到了this,它在谈论类似的说明-MOVSX

从这个问题出发,我对该指令的解释是,它需要双字节(这就是d中有movsxd的原因)并将其复制到rdx寄存器中(在两个最低有效字节),其余部分则用该双字节的符号填充。

我的解释正确吗(我认为我错了)?如果不能,请告诉我发生了什么事?

1 个答案:

答案 0 :(得分:3)

您的代码是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 中的值为{{ 1}},仍然代表已签名的数字0x000000007fffffff。如您所见,符号扩展会在更宽的寄存器的高位上保留符号位,从而保留目标的签名。