旅の途中
你知道阿基米德原理吗?

导航

 

示例代码

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

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

posted on 2017-11-09 22:48  CknightX  阅读(1129)  评论(0编辑  收藏  举报