如何将较小的值弹出到寄存器中

问题描述

我在堆栈上存储了一个2字节的值,我想将其pop放入寄存器。我可以在其中一个通用寄存器中使用16位寄存器来做到这一点,例如:

popw %cx

有没有一种方法可以将它填充到另一个寄存器中,例如r11并进行零填充?像这样:

popzwq %r11   # making up the syntax

或者这样做的正确方法是什么?

解决方法

通常,您首先不要使用pushw来避免这种情况,而应在推入/弹出操作时始终使用全角(64位)堆栈插槽。这还可以使堆栈保持一致。同样,通常只有在进入/退出函数时才使用推/弹出来保存/恢复寄存器。 (没有调用约定,其中低端部分保留了呼叫,但高字节部分没有保留,通常,保存/恢复完整寄存器是最有效的。)

但是,如果您确实需要它,只需使用2条指令对其进行仿真。

   movzwl  (%rsp),%ecx          # or %r11d.  implicitly zero-extends into the full 64-bit reg
   add     $2,%rsp              # or if you need to preserve FLAGS,# lea 2(%rsp),%rsp

没有零扩展的pop形式; 8086只能弹出全角(16位)寄存器,因此没有要修改的现有操作码。 386没有引入与movzx或movsx等效的零扩展流行音乐;几乎没有人会从中受益:普通代码完全使用全角推/弹出。 (与旧的堆栈args调用约定比较常见,该约定在那时很常见,而不是前几个arg的现代高效寄存器args。) 因此,不值得在晶体管和操作码编码空间中花费成本。


或者,如果您不想零扩展,请pop %r11w。 (不知道您是否不知道r8..r15的low-8 / low-16 / low-32寄存器的名称,或者不确定为什么在第二个示例中不使用RCX与pop cx形成对比)。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...