了解程序集递归函数

时间:2011-12-29 08:55:10

标签: c assembly intel factorial i386

我正在学习汇编,我有这个函数包含一些我不明白的行:

. 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对此问题不确定,我们在%esp中存储的数字加4吗?或者我们在指针上添加4以获取下一个数字或类似内容?

1 个答案:

答案 0 :(得分:3)

似乎factR()函数遵循C调用约定(cdecl)。它是调用者将函数调用的参数推送到堆栈并且调用者清理堆栈的地方(撤消对执行该函数的堆栈的更改)当函数返回时调用。

第一次推送(1)将%eax寄存器的内容作为参数发送到以下调用。然后对该函数进行实际调用(2)。然后通过将堆栈指针%esp重置为在步骤1中没有推回参数的状态来清理堆栈(3)。它推送一个32位值,因此它必须通过4个字节。