arm中的PC值

arm中的PC值  


2011-03-12 16:28:57|  分类: 默认分类 |字号 订阅
在计算机体系结构中,PC值(program counter)表示下一条指令存储的地址。在ARM中也是。不过由于ARM采用流水线来提高CPU利用效率,所以无论是ARM7中的3级流水线还是ARM9中的5级流水线,如果当前指令在执行,那么下一条指令一定正在译码,再下一条指令正在读取,PC值实际上是正在读取的指令的地址(它正好是即将执行的指令,满足指向下一条指令的说法)。在中断时,会有一个保存LR的动作,但该值为当时PC的值,然后处理器会对LR进行一次自动调整,使LR=LR-0x04。所以,最终保存在LR中的值是中断发生时该语句的下一条。那么:


1、软中断异常,即中断发生时的指令为SWI的话,从SWI中断,即软中断中返回后应该执行SWI语句的下一条,这条语句正好是LR中的地址。


2、IRQ或FIQ异常中断时,需要重新执行中断发生时的语句,所以应该用LR-4。


3、data abort数据中止异常中止,因为导致数据异常的原因应该是中断发生时语句的上一条语句,所以应该用LR-8


4、Undefined未定义指令返回时LR。


5、预取指令中止LR-4。


注意:复位中断不用定义LR。在arm处理器中利用R14实现对断点和调用点的记录,即使用R14作为返回连接寄存器(LR)。arm处理器针对不同的模式,公用6个连接寄存器,其中用户模式和系统模式公用一个LR,每种异常模式各有专用的R14寄存器(LR),这些连接寄存器分别是:R14,R14_svc,R14_abt,R14_und,R14_irq,R14_fiq.


转载:


BL  NEXT                                 ;跳转到子程序


.........                                          ;NEXT处执行


NEXT


..........


MOV  PC,LR                            ;从子程序返回


这里的BL是跳转的意思,LR(R14)保存了返回地址


PC(R15)是当前地址,把LR给PC就是从子程序返回


这里有一下总结


首先


1.SP(R13) LR(R14)PC(R15)


2.lr(r14)的作用问题,这个lr一般来说有两个作用:
1》.当使用bl或者blx跳转到子过程的时候,r14保存了返回地址,可以在调用过程结尾恢复。
2》.异常中断发生时,这个异常模式特定的物理R14被设置成该异常模式将要返回的地址。


另外注意pc,在调试的时候显示的是当前指令地址,而用mov lr,pc的时候lr保存的是此指令向后数两条指令的地址,大家可以试一下用mov pc,pc,结果得到的是跳转两条指令,这个原因是由于arm的流水线造成的,预取两条指令的结果.


3.》我以前看书不懂的地方


子程序返回的三种方法


现在总结如下


1.MOV PC,LR


2.BL LR


3.在子程序入口处使用以下指令将R14存入堆栈


STMFD    SP!,{<Regs>,LR}


对应的,使用以下指令可以完成子程序的返回


LDMFD  SP!,      {<Regs>,LR}

你可能感兴趣的:(存储)