[英]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.