32位汇编语言学习笔记(14)--递归函数的调用



看一个简单的算阶乘的例子:

int rfact(int n)

{

   int result;

   if (n <= 1)

    {

       result = 1;

    }

   else

    {

       result = n* rfact(n-1);

    }

   return result;

}

 

gcc -O1 -c -m32 rfact.c

objdump -d rfact.o

 

rfact.o:    file format elf32-i386

 

Disassembly of section .text:

 

00000000 <rfact>:

  0:   55                      push   %ebp //保存旧的ebp

  1:   89 e5                   mov    %esp,%ebp //把当前栈指针值设置为ebp

  3:   53                      push   %ebx //保存ebx

  4:   83 ec 04                sub    $0x4,%esp //栈指针下移4

  7:   8b 5d 08                mov    0x8(%ebp),%ebx //ebx = n

  a:   b8 01 00 00 00          mov   $0x1,%eax //eax = 1

  f:   83 fb 01                cmp    $0x1,%ebx //比较ebx1

 12:   7e 0e                   jle    22 <rfact+0x22> //如果ebx小于等于1,跳转到(0x0e+0x14= 0x22)

 14:   8d 43 ff                lea    0xffffffff(%ebx),%eax //eax = n-1

 17:   89 04 24                mov    %eax,(%esp) //把参数n-1作为函数调用的传入参数

 1a:   e8 fc ff ff ff          call  1b <rfact+0x1b>//递归调用

 1f:   0f af c3                imul   %ebx,%eax //result =  n*函数返回值

 22:   83 c4 04                add    $0x4,%esp //清理函数调用参数

 25:   5b                      pop    %ebx //恢复ebx

 26:   5d                      pop    %ebp //恢复ebp

 27:   c3                      ret 


从汇编代码来看,函数调用自身与函数调用其他函数没有什么区别,基本原则就是要保证堆栈的平衡。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值