示例代码

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

递归过程的栈帧

递归调用一个函数本身与调用其他函数是一样的。栈规则提供了一种机制,每次函数调用都有它自己私有的状态信息(返回位置、栈指针、被调用者保存寄存器的值)。如果需要,它还可以提供局部变量的存储。

相关文章:

  • 2021-05-18
  • 2021-05-08
  • 2021-05-18
  • 2022-01-13
猜你喜欢
  • 2021-08-28
  • 2022-12-23
  • 2022-12-23
  • 2021-07-11
  • 2021-05-07
  • 2021-11-02
  • 2021-05-03
相关资源
相似解决方案