[英]Understanding assembly recursive function
我正在學習匯編,並且我具有包含一些我不明白的幾行的函數:
. globl
. text
factR:
cmpl $0 ,4(% esp )
jne cont
movl $1 ,%eax
ret
cont :
movl 4(%esp),%eax
decl %eax
pushl %eax // (1)
call factR // (2)
addl $4,%esp // (3)
imull 4(%esp),%eax
ret
對應的C代碼為:
int factR ( int n ) {
if ( n != 0 )
return n;
else
return n ∗ factR ( n − 1 );
}
我不確定標有數字的行。
pushl %eax
:這是否意味着我們將%eax
的內容放入%esp
?
因此,我們將其稱為factR()
。 當我們回到這里下一條指令時,結果將在%esp
嗎?
addl $4,%esp
不確定這一點,我們將4添加到%esp
存儲的數字還是將4添加到指針以獲得下一個數字或類似的東西?
事實是factR()
函數遵循C調用約定( cdecl )。 在此, 調用者將函數調用的參數推送到堆棧上,並且在函數返回時, 調用者將清理堆棧(撤消對執行函數調用所做的堆棧更改)。
第一次推送(1)將%eax
寄存器的內容作為后續調用的參數。 然后對函數進行實際調用(2)。 然后,通過將堆棧指針%esp
重置為沒有在步驟1中推回參數的狀態來清理(3)堆棧。它壓入了一個32位值,因此必須將指針調整4個字節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.