您的位置:首页 > 其它

sp lr pc详解

2016-01-11 18:39 239 查看
1、堆栈指针r13(SP):每一种异常模式都有其自己独立的r13,它通常指向异常模式所专用的堆栈,也就是说五种异常模式、非异常模式(用户模式和系统模式),都有各自独立的堆栈,用不同的堆栈指针来索引。这样当ARM进入异常模式的时候,程序就可以把一般通用寄存器压入堆栈,返回时再出栈,保证了各种模式下程序的状态的完整性。

2、连接寄存器r14(LR):每种模式下r14都有自身版组,它有两个特殊功能。

(1)保存子程序返回地址。使用BL或BLX时,跳转指令自动把返回地址放入r14中;子程序通过把r14复制到PC来实现返回,通常用下列指令之一:

MOV PC, LR

BX LR

通常子程序这样写,保证了子程序中还可以调用子程序。

stmfd sp!, {lr}

……

ldmfd sp!, {pc}

(2)当异常发生时,异常模式的r14用来保存异常返回地址,将r14如栈可以处理嵌套中断。

3、程序计数器r15(PC):PC是有读写限制的。当没有超过读取限制的时候,读取的值是指令的地址加上8个字节,由于ARM指令总是以字对齐的,故bit[1:0]总是00。当用str或stm存储PC的时候,偏移量有可能是8或12等其它值。在V3及以下版本中,写入bit[1:0]的值将被忽略,而在V4及以上版本写入r15的bit[1:0]必须为00,否则后果不可预测。

LR连接寄存器(Link Register,),在ARM体系结构中LR的特殊用途有两种:一是用来保存子程序返回地址;二是当异常发生时,LR中保存的值等于异常发生时PC的值减4(或者减2),因此在各种异常模式下可以根据LR的值返回到异常发生前的相应位置继续执行。
当通过BL或BLX指令调用子程序时,硬件自动将子程序返回地址保存在R14寄存器中。在子程序返回时,把LR的值复制到程序计数器PC即可实现子程序返回。如,可以使用MOV
PC, LR或者BX LR来完成子程序返回。另外,也可以在在子程序入口处使用下面的指令将LR保存到栈中。

PC为了保证程序能够连续地执行下去,CPU必须具有某些手段来确定下一条指令的地址。而程序计数器正是起到这种作用,所以通常又称为指令计数器。在程序开始执行前,必须将它的起始地址,即程序的一条指令所在的内存单元地址送入PC,因此程序计数器(PC)的内容即是从内存提取的第一条指令的地址。当执行指令时,CPU将自动修改PC的内容,以便使其保持的总是将要执行的下一条指令的地址。由于大多数指令都是按顺序来执行的,所以修改的过程通常只是简单的对PC加1。

SP堆栈是在内存RAM中开辟的一个专门用来存放数据的特殊存储区,其操作原则是“先进后出”。单片机的堆栈类似于商业中的货栈,先进入的货物放在下面,最后被取走。

堆栈有两个要素:栈顶和栈底。栈底的地址是固定的,表示堆栈存储区的开始地方;栈顶的地址是浮动的,记录着当前进栈元素的位置。堆栈中没有数据时,栈顶与栈底是重合的。

AT89S52单片机的堆栈区设在片内RAM中,由堆栈指针寄存器SP寄存器记录着栈顶元素的地址。AT89S52片内RAM有256字节,地址范围为00H~FFH,原则上堆栈可设在这256个字节的任何连续区域中。对堆栈的操作包括压入(PUSH)和弹出(POP)两种,并且遵循先加后压,先弹后减的原则。即压入操作时,硬件电路先将SP内容加1,然后将数压入到SP所指的单元中;弹出操作时,是先将SP所指的内容弹出,然后SP的内容减1。堆栈区是沿地址增大的方向生成的。

系统复位后,SP=07H。因此,第一个压入堆栈的数据存放到08H单元中。在实际应用中,由于片内RAM 08H~1FH为工作寄存器区,20H~2FH为位地址区,因此一般把堆栈指针寄存器sp定义为2FH或更大值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: