我正在学习汇编,我有这个函数包含一些我不明白的行:
. 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
对此问题不确定,我们在%esp
中存储的数字加4吗?或者我们在指针上添加4以获取下一个数字或类似内容?
答案 0 :(得分:3)
似乎factR()
函数遵循C调用约定(cdecl)。它是调用者将函数调用的参数推送到堆栈并且调用者清理堆栈的地方(撤消对执行该函数的堆栈的更改)当函数返回时调用。
第一次推送(1)将%eax
寄存器的内容作为参数发送到以下调用。然后对该函数进行实际调用(2)。然后通过将堆栈指针%esp
重置为在步骤1中没有推回参数的状态来清理堆栈(3)。它推送一个32位值,因此它必须通过4个字节。