我很难弄清楚movslq
指令是做什么的。谷歌并不是很有帮助,在这份清单上也没有这样的指导。这里我读过
MOVSLQ是将一个值从32位源扩展到64位目的地。
我明白这是这样的。指令将一个值从32位源移动到64位目的地,但确保64位目的地中的数字的有符号值等于源中的数字,即在负数情况下,它用1填充目的地的前32位,否则用零填充目的地的前32位。
我的理解正确吗?如果没有,请解释我哪里错了。
编辑:
这不是这个主题的重复:装配cltq和movslq差。我的问题没有任何解释。你得把答案读10分钟才能说服自己。
发布于 2019-04-09 05:28:22
我是movsxd
:https://www.felixcloutier.com/x86/MOVSX:MOVSXD.html。
,您可以通过与AT&T汇编程序组装并使用Intel语法反汇编程序进行反汇编来解决这个问题。(例如,objdumpd -d -Mintel foo.o
**)**
是的,它可以执行32->64位的2补码延拓,通过将源的符号位复制到所有新的上位来扩展。(即dst[63:32] = src[31]
和dst[31:0] = src[31:0]
.)
有趣的事实:在没有REX.W前缀的情况下,可以使用它作为一个32位的副本,它在架构上相当于mov
,但是这样做没有任何好处。或者即使使用操作数大小前缀作为16位副本,但这也是完全没有意义的,请使用mov
。
相关:cltq在组装中做什么?有一个AT&T和Intel助记符的等价表,用于所有x86符号扩展说明,以及描述。(ERAX到DX:AX在-ERAX内,movsx/movzx用于任意寄存器)。
装配cltq和movslq差有更多关于AMD64如何从16/32位模式重新使用ARPL操作码以获得movsxd
的1字节操作码的历史。
https://stackoverflow.com/questions/55584797
复制相似问题