那些年“错过”的C函数调用原理(二)

公众号:编程异思坊
ID:年少无妨
原创声明:本文为公众号原创文章,未经作者同意禁止转载。

上一篇讲解了 C 函数调用原理的一些基本概念,如果还没有完全理解可以回过头多看两遍。技术知识总需要反反复复回过头理解,每一次反复都能得到新的理解。

关于栈帧的建立和删除,下面用一个简单 C 程序实例来进行说明。

  int add(int a,int b)
  {
     int result=a+b;
     return result;
  }
 
  int main(int argc)
  {
     int answer;
     answer=add(40,2);
     return 0;
  }

时刻保持持续学习的状态,每天会过得越来越充实。能坚持看到这里的读者朋友已经非常不容易了,每天多进步一点点,差距就会慢慢拉开的,加油!

言归正传,要了解 C 函数内部调用原理是离不开汇编代码的,下面列举了一些基础汇编代码,加上注释和配图就比较好理解其调用过程。

注:汇编代码框能够左右滑动,可左滑查看被隐藏部分。

 call main  #push return address into stack,jump into main

 push %ebp   #save current ebp register value

 mov %esp,%ebp   #copy esp to ebp


4.

 sub $12,%esp   #make room for stack data


步骤 1 到 4 是调用 main 函数时建立栈帧的过程。

main 函数调用过程是通用的,基本上每个函数都要执行这个调用过程。调用过程可以简单理解为:如步骤 2 到步骤 4 所示,ebp 的当前值被保存到了栈的顶部,然后,将 esp 的内容拷贝到 ebp,esp 再指向新的栈顶,以建立一个新的栈帧。

 mov $2,4(%esp)   #set b to 2
 mov $40,(%esp)   #set a to 40


6.

 call add   #push return address into stack,jump into add


7.

 push %ebp   #save current ebp register valve


8.

 mov %esp,%ebp   #copy esp to ebp


9.

 sub $4,%esp   #make room for result


10.

 mov 12(%ebp),%eax   #move b to eax
 mov 8(%ebp),%edx    #move a to edx
 add %edx,%eax       #add edx into eax,total is 42


11.

 mov %eax,-4(%ebp)   #copy eax to result


如步骤 11 所示,主调函数(main 函数)栈帧范围从 argc 到 answer,而被调函数(add 函数)栈帧范围从 b 到 result。至此,add 函数的调用过程结束,紧接着是 C 函数的返回过程。

返回过程就下篇文章再讲解,敬请期待!

欢迎读者朋友们关注我的个人公众号【编程异思坊】。【编程异思坊】专注于c/c++、Linux、数据结构与算法等计算机基础知识分享。在这里,以巩固基础为核心,希望自己的点滴分享能够帮到更多的人。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值