如何解决如何将较小的值弹出到寄存器中
我在堆栈上存储了一个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形成对比)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。