我是第一次学习计算机系统的学生(有计算机系统:程序员的观点)。我们正在进行汇编,我开始理解x86_64的命令后缀,例如使用leaq
:
leaq (%rsp, %rdx), %rax
但是,我无法理解使用pop
的后缀。例如,使用相同的逻辑,我认为我们将popl
用于以下内容是有意义的:
popl %edi
但是,在网上的文字和其他例子中,我只看到:
pop %edi
有什么不同? popl
甚至有效吗?只是寻找更多的洞察力。什么都有帮助,谢谢。
你可以在asm中做什么受到硬件可以做什么的限制。源中的隐式与显式操作数大小(后缀或不后缀)不会更改它将汇编的机器代码。
所以要问的问题是硬件是否可以在64位模式下进行32位推送?不,它不能,因此不存在asm源语法将使它完全按照您尝试使用一条指令执行的操作。
这就是为什么你的汇编程序不会接受pop %edi
或popl %edi
。这些完全等效,因为32位寄存器意味着DWORD(l
)操作数大小。您在popl
或pop %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?