Chinaunix首页 | 论坛 | 博客
  • 博客访问: 160389
  • 博文数量: 70
  • 博客积分: 2050
  • 博客等级: 大尉
  • 技术积分: 690
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-22 22:04
文章分类

全部博文(70)

文章存档

2014年(1)

2013年(1)

2012年(3)

2011年(48)

2010年(17)

我的朋友

分类: LINUX

2011-01-05 21:27:56

LR连接寄存器(Link Register,),在ARM体系结构中LR的特殊用途有两种:一是用来保存子程序返回地址;二是当异常发生时,LR中保存的值等于异常发生时PC的值减4(或者减2),因此在各种异常模式下可以根据LR的值返回到异常发生前的相应位置继续执行。

当通过BLBLX指令调用子程序时,硬件自动将子程序返回地址保存在R14寄存器中。在子程序返回时,把LR的值复制到程序计数器PC即可实现子程序返回。如,可以使用MOV PC, LR或者BX LR来完成子程序返回。另外,也可以在在子程序入口处使用下面的指令将LR保存到栈中。

 

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

 

SP堆栈是在内存RAM中开辟的一个专门用来存放数据的特殊存储区,其操作原则是先进后出。单片机的堆栈类似于商业中的货栈,先进入的货物放在下面,最后被取走。
堆栈有两个要素:栈顶和栈底。栈底的地址是固定的,表示堆栈存储区的开始地方;栈顶的地址是浮动的,记录着当前进栈元素的位置。堆栈中没有数据时,栈顶与栈底是重合的。

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

      
系统复位后,SP=07H。因此,第一个压入堆栈的数据存放到08H单元中。在实际应用中,由于片内RAM 08H1FH为工作寄存器区,20H2FH为位地址区,因此一般把堆栈指针寄存器sp定义为2FH或更大值。

 

阅读(2306) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~