1、函数的调用原理

1> 将返回点的地址压栈;

2> 修改PC指针,跳转到目标地址只执行;

3> 返回时,直接将返回地址从栈中弹出到PC指针,实现函数的返回

对于M3、M4内核,引入了一个链接寄存器LR(Link Register),专门用来保存函数返回地址。LR本子上相当于一个深度为1的硬件栈,支持且仅1级函数调用。借助LR,内核对叶子函数的调用过程如下:

1> 将当前LR的值压栈

2> 将返回点地址放入LR中(这是由跳转指令自动完成的);

3> 修改PC指针,跳转到目标地址执行(这实际上也是同一条指令完成的)

4> 返回时,直接将LR的值赋值给PC指针,实现函数的返回

5> 将先前把存在栈中的LR值出栈

ARM的跳转指令可以从当前指令向前或向后32M的地址空间跳转。如下

B:跳转指令

BL:带返回的跳转指令         (同时还将PC寄存器的值保存到LR寄存器中)

BLX:带返回的状态切换的跳转指令

BX:带状态切换的跳转指令

ARM5 及以上版本中,实现了ARM指令集和Thumb指令集的混用。指令使用目标地址值的bit[0]来确定目标程序的类型。bit[0]的值为1,目标程序为Thumb指令(半字对齐);bit[0]的值为0,目标程序为ARM(字对齐)指令;

函数调用原理

2、中断/异常处理程序时如何得到执行的

对于函数调用来说,是跳转指令触发的;对于中断/异常处理来说,是未被屏蔽的中断/异常请求触发的。在ARM Cortex M内核引入了 "退出令牌(EXC_RETURN)"这一概念,执行过程额u下

函数调用原理

1> 将当前 "返回点地址" 和 LR 的值压栈(这是内核自动完成的)

2>将 "退出令牌" 放入LR中(这是内核自动完成的)

3>修改PC指针,跳转到中断/异常处理程序的首地址处执行(这是内核自动完成的)

4>返回时,直接将LR的值赋值给PC指针。由于当前LR内保存的是退出令牌,触发内核中断/异常处理模式(这是内核自动完成的)

5>将先前保存在栈中的LR值和 "返回点地址" 出栈,其中 "返回点地址" 被弹出到PC指针中,从先前的中断点继续执行(这是内核自动完成的)

 

相关文章: