movslq 有什么作用?

ibo*_*odi 5 assembly x86-64 att sign-extension

我很难找出movslq指令的作用。谷歌不是很有帮助,这个列表上没有这样的说明。在这里,我读过

MOVSLQ 是将值从 32 位源移动并符号扩展到 64 位目标。

我是这样理解的。该指令将一个值从 32 位源移动到 64 位目标,但确保 64 位目标中数字的有符号值等于来自源的数字,即在负数的情况下,它填充前 32 位目的地为 1,否则为 0。

我的理解正确吗?如果不是,请解释我错在哪里。

编辑:

这不是本主题的重复: assembly cltq 和 movslq difference。我的问题没有解释。您必须阅读整个答案 10 分钟才能说服自己。

Pet*_*des 8

它是movsxdhttps://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 符号扩展指令,以及说明。([ER]AX 到 DX:AX,in-[ER]AX 和 movsx/movzx 到任意寄存器。)

汇编 cltq 和 movslq 的差异在 AMD64 如何从 16/32 位模式重新利用 ARPL 操作码以获得movsxd.