我很难找到movslq
指令的作用。谷歌不是很有帮助,并且没有关于this list的此类指示。 Here我读过这个
MOVSLQ移动并将值从32位源扩展到64位目标。
我明白这就是这个。该指令将值从32位源移动到64位目标,但确保64位目标中的数字的有符号值等于来自源的数字,即在负数的情况下,它填充前32位目的地为1,否则为零。
我的理解是否正确?如果没有,请解释我错在哪里。
编辑:
这不是这个主题的重复:assembly cltq and movslq difference。我的问题没有解释。而你必须阅读整个答案10分钟才能说服自己。
这是movsxd
:https://www.felixcloutier.com/x86/MOVSX:MOVSXD.html。
您可以通过将其与AT&T汇编器组装并使用Intel语法反汇编程序进行拆卸来自行解决这个问题。 (例如objdumpd -d -Mintel foo.o
)
是的,它确实是32-> 64位2's complement sign extension,通过将源的符号位复制到所有新的高位来扩展。 (即dst[63:32] = src[31]
和dst[31:0] = src[31:0]
。)
有趣的事实:它可以在没有REX.W前缀的情况下使用它,因为它只是一个32位的副本,在架构上等同于mov
,但是这样做没有任何优势。或者即使将操作数大小的前缀作为16位副本,但再次完全没有意义,请使用mov
。
相关:What does cltq do in assembly?为所有x86符号扩展指令提供AT&T与Intel助记符的等价表,以及描述。 ([ER] AX到DX:AX,在 - [ER] AX内,movsx / movzx到任意寄存器。)
assembly cltq and movslq difference有更多关于AMD64如何从16/32位模式重新利用ARPL操作码以获得movsxd
的1字节操作码的历史。