函数调用的本质

        今天简单剖析一下函数调用的整个过程,让大家明白这个过程中CPU到底做了什么事。

CPU正在高度紧张的执行着一个特定的任务,突然间收到通知要暂停当前的事,于是下面的事情开始了:

1、保护现场,保护现场的目的就是为了保证中断服务程序执行完毕后CPU可以正常的返回到上次被打断的地方继续执行。现场保护做了什么事呢?①保存当前函数下一条要执行的指令的地址,通过PUSH的方式将其入栈;②保存当前CPU的寄存器的值,通过PUSH的方式将其入栈;

2、修改PC指针的值,然后跳转到中断向量表中

3、执行中断向量表中的跳转指令,这时PC指针的值被修改了对应的中断服务函数入口地址,也就是纯粹的跳转,不需要保护这里的现场。

4、执行完中断服务函数后,恢复现场。恢复现场就是说把第一步保护好的数据重新调取出来还给相关的寄存器,所以这个过程做了这些事:①恢复CPU各个寄存器的值,通过POP指令从堆栈中恢复;②恢复PC寄存器的值,通过POP指令从堆栈中恢复。

        这里有个问题需要说明,那就是堆栈的数据结构特点,它属于先入后出的数据结构,因此,入栈时如果先保护PC寄存器的值,后保护CPU其他寄存器的值,那么出栈的时候,就要先恢复CPU寄存器的值,后恢复PC寄存器的值。不过对于C51、AVR等单片机来说,这个过程完全是硬件行为,不需要程序员干预,而对于cortex 内核来说,就需要程序员自己去处理这些动作了。

        下图就是函数调用的完整过程,非常清晰。

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值