看一个简单的算阶乘的例子:
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 //比较ebx和1
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
从汇编代码来看,函数调用自身与函数调用其他函数没有什么区别,基本原则就是要保证堆栈的平衡。