[英]Understanding the pop instruction in assembly
我是一名初次學習計算機系統的學生(帶有計算機系統:程序員的觀點)。 我們正在組裝,我開始了解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有點特殊: push $1
將默認為64位push,即使pushw $1
是可能的。 當我未指定操作數大小時,push指令會將多少個字節推入堆棧?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.