首页 > 解决方案 > movslq 是做什么的?

问题描述

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

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

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

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

编辑:

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

标签: assemblyx86-64attsign-extension

解决方案


它是movsxdhttps ://www.felixcloutier.com/x86/MOVSX:MOVSXD.html 。

您可以通过使用 AT&T 汇编器组装它并使用 Intel 语法反汇编器进行反汇编来自己解决这个问题。(例如objdumpd -d -Mintel foo.o


是的,它做了 32->64-bit 2's 补码扩展,通过将源的符号位复制到所有新的高位来扩展。(即dst[63:32] = src[31],和dst[31:0] = src[31:0]。)

有趣的事实:可以在没有REX.W 前缀的情况下将其用作仅在架构上等效于 的 32 位副本mov,但这样做的优势为零。或者甚至将操作数大小的前缀作为 16 位副本,但这完全没有意义,请使用mov.


相关:cltq 在汇编中做了什么?具有所有 x86 符号扩展指令的 AT&T 与 Intel 助记符的等效表以及描述。([ER]AX 到 DX:AX、[ER]AX 内和 movsx/movzx 到任意寄存器。)

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


推荐阅读