我一直在使用intel mpx,发现它增加了某些我听不懂的说明。例如(采用英特尔格式):
movsxd rdx,edx
我找到了this,它在谈论类似的说明-MOVSX
。
从这个问题出发,我对该指令的解释是,它需要双字节(这就是d
中有movsxd
的原因)并将其复制到rdx
寄存器中(在两个最低有效字节),其余部分则用该双字节的符号填充。
我的解释正确吗(我认为我错了)?如果不能,请告诉我发生了什么事?
答案 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
。如您所见,符号扩展会在更宽的寄存器的高位上保留符号位,从而保留目标的签名。