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}
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}