分类: LINUX
2011-01-05 21:27:56
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或更大值。