汇编递归过程

这篇博客探讨了在汇编语言中如何实现C语言的递归函数,特别是通过分析fibonacci数列的C语言和汇编代码,揭示了函数调用时栈的操作过程。博主强调,虽然汇编指令直接操作地址,但处理栈地址需要明确指令对栈的影响。通过这个例子,读者可以更深入地理解C语言递归函数的本质。
摘要由CSDN通过智能技术生成

汇编的递归过程

习惯写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),
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值