0

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

. 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 以获得下一个数字或类似的东西?

4

1 回答 1

3

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

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

于 2011-12-29T09:07:23.800 回答