汇编的递归过程
习惯写C程序后,一般很少会去敲汇编代码,最近在研究系统学习方面知识,需要用到汇编,考虑到编译器是如何将C程序编译成汇编代码的,这里对于C语言中的语句(赋值,运算,选择,循环)就不着重介绍,这些对应到汇编指令相对来说简单(当然忽略了编译器是如何把C语言编译成汇编代码的实现,只研究对应问题),今天主要分析C语言中函数在汇编中的实现,因为这里面涉及到栈的问题,对于汇编语言,指令完成命令无疑就是操作地址中的操作数,对于通用寄存器来说,地址是很好确定的,而对于栈的地址,我们必须清楚的知道我们的指令对栈的操作。所以,我针对C语言中的递归函数来分析汇编指令的实现过程,这不仅学习了汇编,同时也更让我清楚的了解了C语言递归函数的实质,函数调用之间的关系。
fibonacci数列
C语言实现:
#include <stdio.h>
int fu(int x)
{
if(x<1)
return 1;
else
return fu(x-2)+fu(x-1);
}
int main()
{
int x;
fu(x);
return 0;
}
机器反汇编代码:(每一步的执行都对应一条汇编指令,真正用汇编语言实现不用如此麻烦,因为,汇编语言也支持选择,循环,调用)
00401020 push %ebp
00401021 mov %esp,%ebp
00401023 push %ebx
00401024 sub $0x34,%esp
00401027 movl $0x401150,(%esp)
0040102E call 0x4019b4 <SetUnhandledExceptionFilter@4>
00401033 sub $0x4,%esp
00401036 call 0x401360 <__cpu_features_init>
0040103B call 0x401770 <fpreset>
00401040 lea -0x10(%ebp),