前言
-
R13:SP堆栈指针寄存器
功能:指向堆栈的栈顶
详解:
1)异常模式发生时,程序把通用寄存器压入堆,SP一直指向栈顶的位置。返回时再出栈,保证程序状态的完整性。大部分情况下,只要程序在执行,堆栈就会被建立,而SP指向堆栈的栈顶位置。
2)有MSP 和PSP(两者只需一个,不能同时使用,默认MSP)。
MSP :主堆栈指针,系统用。PSP : 进程堆栈指针,个人堆栈指针。 -
R14:LR连接寄存器
功能:保存断点地址。
详解:
1)用来保存子程序的返回地址;
当调用子程序时,R14保存子程序的返回地址。子程序返回时,把R14的值复制到程序计数器PC,实现子程序的返回。
2)当异常发生时,用R14保存异常返回的地址。
R14中保存的值等于异常发生时程序计数器PC的值减4(因为cortex-m3采用3级指令流水线)。因此在异常模式下,可以根据R14的值返回到异常发生前的相应位置,继续执行。 -
R15:PC程序计数寄存器
功能:指向下一条要执行的指令地址。
详解:
在程序开始执行前,将程序的第一条指令地址送入PC,CPU按照PC的指示从内存读取第一条指令(取指)。当执行指令时,PC总是指向下一条指令地址。当程序转移时,转移指令执行的最终结果就是要改变PC的值,此PC值就是转去的目标地址。处理器总是按照PC指向取指、译码、执行,以此实现了程序转移
一、代码
- 原 C 语言函数代码:
- 对应的 main 函数和 add_val 函数的汇编代码:
二、执行流程
1.
2.
3.
4.
5.![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/ad96331dcdb82652e3fb6011a37cd6b8.png)
6.
7.
8.
9.
最后 add_val 函数执行结束,将会把当初保存的 LR 寄存器的值,取出来保存到 PC 寄存器。
所以,程序的下一条指令的位置,就是 main() 函数中调用 add_val()函数的下一条语句的位置。
10.
我们可以看到,main() 函数的 push 和 pop 指令, 是一一对应的。
使用 pop 指令将栈顶元素取出,保存到 PC 寄存器中。
之后,CPU 的下一条指令地址,就是在 PC 寄存器中保存的指令地址。
同理, add_val函数中的 push 和 pop 指令, 也是一一对应的。