ARM PC的值问题
2014-04-30 18:23
239 查看
PC=当前指令地址+8
主要原因是流水线。
流水线主要由三个部分组成:
1、取指 2、译码 3、执行
多级的流水线也是这三个部分的细分。
当当前指令在执行时,下一条指令正在译码,再下一条指令正在读取,PC的值为正在读取的指令的地址。
每条指令在ARM指令集下为4字节,当前指令地址与正在读取指令地址相差的8个字节。
所以PC=当前指令地址+8。
在中断时,会有一个保存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
主要原因是流水线。
流水线主要由三个部分组成:
1、取指 2、译码 3、执行
多级的流水线也是这三个部分的细分。
当当前指令在执行时,下一条指令正在译码,再下一条指令正在读取,PC的值为正在读取的指令的地址。
每条指令在ARM指令集下为4字节,当前指令地址与正在读取指令地址相差的8个字节。
所以PC=当前指令地址+8。
在中断时,会有一个保存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