簡體   English   中英

了解程序集遞歸函數

[英]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 );
}

我不確定標有數字的行。

  1. pushl %eax :這是否意味着我們將%eax的內容放入%esp

  2. 因此,我們將其稱為factR() 當我們回到這里下一條指令時,結果將在%esp嗎?

  3. 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.

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