递归函数的堆栈操作

本文通过C语言的阶乘递归程序,详细解释了递归函数调用过程中堆栈的操作,包括参数传递、栈帧建立、递归调用及返回过程,帮助读者理解递归函数的工作原理。
摘要由CSDN通过智能技术生成
前文我们介绍了函数调用和返回的过程,下面我们以递归为例进一步看一下函数调用的堆栈操作。我们就先用C语言写一个阶乘的简单递归程序factorial.c: 
        
 1#include
 2
 3int factorial(int a){
 4        int ret;
 5        if (a > 1){
 6                ret = a * factorial(a-1);
 7       }else{
 8                ret = 1;
 9       }
10        return ret;
11}
12
13int main(int argc, char *argv[]){
14        int a = 4;
15        int r;
16        r = factorial(a);
17        printf("the result is %d\n", r);
18        return 0;
19}
        
这回我就不想反汇编了,直接进行编译并结束在汇编指前: 
gcc -S -o factorial.s factorial.c 

然后我们打开factorial.s文件,里面的内容比较多,有很多与本文讲解无关的地方我就删掉了,让世界清静一些: 
factorial:
        pushq   %rbp
        movq    %rsp, %rbp
        subq    $32, %rsp
        movl    %edi, -20(%rbp)
        cmpl    $1, -20(%rbp)
        jle     .L2
        movl    -20(%rbp), %eax
        subl    $1, %eax
        movl    %eax, %edi
        call    factorial
        imull   -20(%rbp), %eax
        movl    %eax, -4(%rbp)
        jmp     .L3
.L2:
        movl    $1, -4(%rbp)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值