理解程序集中的pop指令

问题描述 投票:0回答:1

我是第一次学习计算机系统的学生(有计算机系统:程序员的观点)。我们正在进行汇编,我开始理解x86_64的命令后缀,例如使用leaq

leaq (%rsp, %rdx), %rax

但是,我无法理解使用pop的后缀。例如,使用相同的逻辑,我认为我们将popl用于以下内容是有意义的:

popl %edi

但是,在网上的文字和其他例子中,我只看到:

pop %edi

有什么不同? popl甚至有效吗?只是寻找更多的洞察力。什么都有帮助,谢谢。

gcc assembly x86-64 inline-assembly
1个回答
2
投票

你可以在asm中做什么受到硬件可以做什么的限制。源中的隐式与显式操作数大小(后缀或不后缀)不会更改它将汇编的机器代码。

所以要问的问题是硬件是否可以在64位模式下进行32位推送?不,它不能,因此不存在asm源语法将使它完全按照您尝试使用一条指令执行的操作。

这就是为什么你的汇编程序不会接受pop %edipopl %edi。这些完全等效,因为32位寄存器意味着DWORD(l)操作数大小。您在poplpop %edi中看到的示例适用于32位模式,其中EDI是完整寄存器而不是RDI的低半部分,并且该指令是可编码的。

当它不明确时,你只需要一个大小后缀,mov $1, (%rdi)。你的汇编程序会给出错误,而不是猜测b / w / l / q中的一个。

但推动有点特别:push $1将默认为64位推,即使pushw $1是可能的。 How many bytes does the push instruction push onto the stack when I don't specify the operand size?

© www.soinside.com 2019 - 2024. All rights reserved.