理解汇编中的pop指令
Understanding the pop instruction in assembly
我是第一次学习计算机系统的学生(w/ 计算机系统:程序员的视角)。我们正在研究汇编,我开始理解 x86_64 的命令后缀,例如在以下内容中使用 leaq
:
leaq (%rsp, %rdx), %rax
但是,我无法理解为 pop
使用后缀。例如,使用相同的逻辑,我们将 popl
用于类似的东西对我来说是有意义的:
popl %edi
但是,在网上的文字和其他例子中,我只看到:
pop %edi
有什么区别? popl
有效吗?只是在寻找更多的洞察力。有什么帮助,谢谢。
您在 asm 中可以做的事情受到硬件可以做的事情的限制。源代码中的隐式与显式操作数大小(后缀与否)不会更改它将 assemble 更改为的机器码。
所以正确的问题是硬件是否可以在 64 位模式下进行 32 位推送?不,它不能,因此不存在任何 asm 源语法可以让它完全按照一条指令执行您尝试执行的操作。
- x86 Assembly pushl/popl don't work with "Error: suffix or operands invalid"
这就是为什么您的 assembler 不接受 pop %edi
或 popl %edi
的原因。这些是完全等价的,因为 32 位寄存器意味着 DWORD (l
) 操作数大小。 您看到的 popl
或 pop %edi
的示例是针对 32 位模式的, 其中 EDI 是完整寄存器而不是 RDI 的低半部分,并且该指令是可编码的。
只有尺寸不明确时才需要尺寸后缀,mov , (%rdi)
。您的 assembler 会给出一个错误,而不是猜测 b/w/l/q.
之一
但是推送有点特殊:push
将默认为 64 位推送,即使 pushw
是可能的。 How many bytes does the push instruction push onto the stack when I don't specify the operand size?
我是第一次学习计算机系统的学生(w/ 计算机系统:程序员的视角)。我们正在研究汇编,我开始理解 x86_64 的命令后缀,例如在以下内容中使用 leaq
:
leaq (%rsp, %rdx), %rax
但是,我无法理解为 pop
使用后缀。例如,使用相同的逻辑,我们将 popl
用于类似的东西对我来说是有意义的:
popl %edi
但是,在网上的文字和其他例子中,我只看到:
pop %edi
有什么区别? popl
有效吗?只是在寻找更多的洞察力。有什么帮助,谢谢。
您在 asm 中可以做的事情受到硬件可以做的事情的限制。源代码中的隐式与显式操作数大小(后缀与否)不会更改它将 assemble 更改为的机器码。
所以正确的问题是硬件是否可以在 64 位模式下进行 32 位推送?不,它不能,因此不存在任何 asm 源语法可以让它完全按照一条指令执行您尝试执行的操作。
- x86 Assembly pushl/popl don't work with "Error: suffix or operands invalid"
这就是为什么您的 assembler 不接受 pop %edi
或 popl %edi
的原因。这些是完全等价的,因为 32 位寄存器意味着 DWORD (l
) 操作数大小。 您看到的 popl
或 pop %edi
的示例是针对 32 位模式的, 其中 EDI 是完整寄存器而不是 RDI 的低半部分,并且该指令是可编码的。
只有尺寸不明确时才需要尺寸后缀,mov , (%rdi)
。您的 assembler 会给出一个错误,而不是猜测 b/w/l/q.
但是推送有点特殊:push
将默认为 64 位推送,即使 pushw
是可能的。 How many bytes does the push instruction push onto the stack when I don't specify the operand size?