int fib(int n) {
if(n==0) return 0;
else if(n==1) return 1;
else return fib(n-1)+fib(n-2);
}
int main(){
int a=fib(4);
return a;
}
汇编代码:fib:
pushq %rbp //在函数调用之前,会主动的将父函数的栈内容进行保存
movq %rsp, %rbp
pushq %rbx //rbx入栈
subq $24, %rsp //栈顶指针向下移动,即提前预留24个字节的地址空间
movl %edi, -20(%rbp) //将edi里面的值传入rbp-20的地址空间内(n值)
cmpl $0, -20(%rbp) //将0与rbp-20地址空间存入的值进行比较
jne .L2 //如果不相等,跳往.l2
movl $0, %eax //将0赋予eax
jmp .L3 //跳往.L3
.L2:
cmpl $1, -20(%rbp) //比较1与rbp-20地址空间存入的值进
jne .L4 //如果不想打则跳往.L4
movl $1, %eax //将1赋予eax
jmp .L3 //跳往.L3
.L4:
movl -20(%rbp), %eax //将rbp-20地址空间内的值传入eax
subl $1, %eax //将eax-1
movl %eax, %edi //再将eax里的值传入edi
call fib //调用fib函数
movl %eax, %ebx //将eax的值传入ebx
movl -20(%rbp), %eax //将rbp-20地址空间内的值传入eax
subl $2, %eax //将eax-2
movl %eax, %edi //再将eax里的值传入edi
call fib //调用fib函数
addl %ebx, %eax //将ebx和eax寄存器的值相加存入eax中
.L3:
movq -8(%rbp), %rbx //将栈底指针rbp-8地址的值送入rbx
leave
ret
main:
pushq %rbp
movq %rsp, %rbp
subq $16, %rsp //将rsp下移,提前预留16个地址的空间
movl $4, %edi //将n值=4传到寄存器edi当中
call fib //调用fib函数(函数参数存在edi中)
movl %eax, -4(%rbp) //将函数调用的结果存入rbp-4的位置
movl -4(%rbp), %eax //将main函数的结果传入eax数据寄存器
leave
ret