汇编C语言调用约定(递归函数)

汇编及C/C++汇编调用约定讲解

> 汇编及C/C++汇编调用约定(汇总帖)
> 汇编编译和gdb调试命令列表
> gdb TUI使用方法
> 汇编C语言调用约定(标准函数)
> 汇编C语言调用约定(递归函数)
> C++内存模型以及寄存器指针rsp和rbp



1. 递归函数

  1. 基线条件:递归停止的地方
  2. fac函数:
    .type factorial, @function
    factorial:
    pushl %ebp
    movl %esp, %ebp
    
    # 4(%ebp) 保存返回值地址
    movl 8(%ebp), %eax
    
    cmp $1, %eax
    je end_factorial
    
    decl %eax
    pushl %eax
    
    call factorial
    movl 8(%ebp), %ebx
    
    imull %ebx, %eax
    
    end_factorial:
    movl %ebp, %esp
    popl %ebp
    
    ret
    

2. 递归函数完整示例

 .section .data
 .section .text

 .globl _start
 .globl factorial

_start:
 pushl $4
 call factorial

 add $4, %esp
 
 movl %eax, %ebx
 movl $1, %eax
 int $0x80

 .type factorial, @function
factorial:
 pushl %ebp
 movl %esp, %ebp

 movl 8(%ebp), %eax

 cmp $1, %eax
 je end_factorial

 decl %eax
 pushl %eax

 call factorial
 movl 8(%ebp), %ebx

 imull %ebx, %eax

end_factorial:
 movl %ebp, %esp
 popl %ebp

 ret

3. 递归函数调试

  • 关于递归我这里在纸上写了一个单步执行时栈的状态:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值