簡體   English   中英

了解匯編中的彈出指令

[英]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 %edipopl %edi 它們完全等效,因為32位寄存器隱含了DWORD( l )操作數大小。 您看到的poplpop %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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM