示例代码
int rfact(int n)
{
int result;
if (n<=1)
result=1;
else
result=n*rfact(n-1);
return result;
}
对应的汇编代码
rfact:
pushl %ebp ;保存帧指针
movl %esp,%ebp ;设定新的帧指针
pushl %ebx ;保存被调用者寄存器
subl $4,%esp ;在栈上分配4bytes空间
movl 8(%ebp),%ebx ;获得n的值
movl $1,%eax ;result=1
cmpl $1,%ebx
jle .L53 ;if n<=1 goto .L53
leal -1(%ebx),%eax;计算n-1
movl %eax,(%esp) ;n-1的值放在栈顶
call rfact ;递归调用自身
imull %ebx,%eax ;result=n*rfact(n-1)
.L53
addl $4,%esp ;释放4bytes的空间
popl %ebx
popl %ebp
ret
递归调用一个函数本身与调用其他函数是一样的。栈规则提供了一种机制,每次函数调用都有它自己私有的状态信息(返回位置、栈指针、被调用者保存寄存器的值)。如果需要,它还可以提供局部变量的存储。