前言
在操作系统中必然设计多任务的切换,在任务切换时,系统会把当前任务的现场数据保存在该任务的任务栈里,便于下次载入该任务时的运行环境设定。任务栈的栈顶指针一般保存在任务控制块中(Task Control Block,TCB
))。任务切换会改变CPU的PC、SP和各种寄存器,本文简单对LR、PC和SP寄存器进行介绍。
1. LR
LR用途有二,一是保存子程序返回地址,当调用BL、BX、BLX等跳转指令时会自动保存返回地址到LR;二是保存异常发生的异常返回地址。
2. PC
PC(Program Counter)为程序计数器,用于保存程序的执行地址,在ARM的三级流水线架构中,程序流水线包括取址、译码和执行三个阶段,PC指向的是当前取址的程序地址,所以32位ARM中,译码地址(正在解析还未执行的程序)为PC-4,执行地址(当前正在执行的程序地址)为PC-8。
当突然发生中断的时候,保存的是PC的地址。如果返回的时候返回PC,那么中间就有一个指令没有执行,所以用SUB pc lr-irq #4。
3. SP
每一种异常模式都有其自己独立的r13,它通常指向异常模式所专用的堆栈,也就是说五种异常模式、非异常模式(用户模式和系统模式),都有各自独立的堆栈,用不同的堆栈指针来索引。这样当ARM进入异常模式的时候,程序就可以把一般通用寄存器压入堆栈,返回时再出栈,保证了各种模式下程序的状态的完整性。