前文我们介绍了函数调用和返回的过程,下面我们以递归为例进一步看一下函数调用的堆栈操作。我们就先用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)