ARM的PC指针

上传人:飞*** 文档编号:53055194 上传时间:2018-08-27 格式:PDF 页数:4 大小:41.44KB
返回 下载 相关 举报
ARM的PC指针_第1页
第1页 / 共4页
ARM的PC指针_第2页
第2页 / 共4页
ARM的PC指针_第3页
第3页 / 共4页
ARM的PC指针_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《ARM的PC指针》由会员分享,可在线阅读,更多相关《ARM的PC指针(4页珍藏版)》请在金锄头文库上搜索。

1、这几天研究ARM 中断,呗跳转指令地址搞的很惨,对亏度娘了。特此和大家分享!ARM 指令流水线当前 “取指 PC“= 当前 PC当前 “译码 PC“=当前 PC-4当前 “执行 PC“=当前 PC-8很容易理解ARM 指令集中 : 例程 (1) BL delay ;LR=当前 PC-4( 即当前指令 “ 执行 PC“+8-4) mov r0,#0 ; delay mov PC,LR ; 子函数返回 ; 即返回到调用时“ 当前 PC“-4 位置 ( 即当前指令(“ 执行 PC“+8)-4);即返回到函数调用指令的下一条指令(mov r0,#0;)处例程 (2) mov r0,#1 ; 当 EIN

2、T1 在此处发生中断,LR=当前 PC(即当前指令 “执行 PC“+8) mov r0,#0 ; EINT1_Handler subs PC,LR,#4 ;LR=LR-4 中断返回 ; 即返回到中断时“ 当前 PC“-4 位置 ( 即当前指令 (“ 执行 PC“+8)-4);即返回到子函数调用指令的下一条指令(mov r0,#0;)处在三级流水线下上面的描述及其容易理解,流水线增多后似乎不太合适讲,但在架构下记住这点就行了,也是最重要的:当前 “ 执行 PC“=当前 PC-8ARM 体系结构与编程清华大学出版社杜春雷第九章异常中断处理我的理解如下 :1.SWI 和和未定义指令异常中断的返回:

3、指令地址A PC-8 当前指令为SWI或未定义指令此时发生中断 .PC 的值还没有更新 .( 不需要执行完此指令,就跳到中断了) A+4 PC-4 中断时处理器将PC-4 保存到 LR A+8 PC返回时 , 从发生中断的指令A(PC-8) 的下一条指令A+4(PC-4) 处开始执行 , 所以直接把 LR的值赋给PC就行了 , 具体指令为MOV PC,LR (PC=A+4=LR)2,IRQ 和 FIQ 异常中断处理的返回: 指令地址对应于 PC A PC-8 执行此指令完成后(!) 查询 IRQ 及 FIQ, 如果有中断请求则产生中断 . .(需要执行完此指令,再跳到中断) A+4 PC-4

4、A+8 PC( 此时 PC的值已经更新, 指向 A+12.将当前 PC-4(即 A+8) 保存到 LR.返回时 , 要接着执行A+4(LR-4) 处的指令 , 所以返回指令为SUBS PC, LR,#4(PC=A+4=LR-4)3, 指令预取中止异常中断处理的返回: 指令地址A PC-8 执行本指令时发生中断, A+4 PC-4 处理器将A+4(PC-4) 保存到 LR. A+8 PC返回时 , 发生指令预取中止的指令 A(PC-8) 处重新执行 (A 处的指令要重新执行) , 所以返回指令为SUBS PC, LR,#4(PC=A=LR-4)4, 数据访问中止异常中断处理的返回:指令地址A P

5、C-8 本指令访问有问题的数据, 产生中断时 ,PC 的值已经更新A+4 PC-4 中断发生时PC=A+12,处理器将 A+8(PC-4) 保存到 LR. A+8 PC返回时 , 要返回到A处继续执行 , 所以指令为SUBS PC, LR,#8.(PC=A=LR-8)(A 处的指令要重新执行) ,arm7 是三级流水线,当产生异常时, ARM 核拷贝 CPSR 寄存器的内容SPSR _ 寄存器中,同时设置适当的 CPSR位、改变处理器状态进入ARM态和处理器模式,从而进入相应的异常模式。在设置中断禁止位禁止相应中断 (如果需要 )后, ARM 核保存返回地址到LR_ ,同时设置PC 为相应的异

6、常向量。当异常返回时, 异常处理需要从SPSR _ 寄存器中恢复CPSR 的值,同时从LR_ 恢复 PC,具体的异常返回指令如下:? 从 SWI 和 Undef 异常返回时使用:MOV S PC, LR ;? 从 FIQ、IRQ 和预取终止返回时使用:SUBS PC, LR ,#4;? 从数据异常返回时使用:SUBS PC, LR ,#8 在使用上述指令异常返回时,如果LR 之前被压栈的话使用LDM “”, 例如:LDMFD SP!, PC退出异常处理SWI 和未定义指令异常中断是由当前执行的指令自身产生的。当SWI 和未定义指令异常中断产生时,程序计数器 PC 的值还未更新,它指向当前指令后

7、面第2 条指令 (对于 ARM 指令来说 +8 字节;对于Thumb 指令来说 +4字节的位置 )。当 SWI 和未定义指令异常中断产生时,处理器将值(PC-4) 保存到异常模式下的寄存器LR_mode中。这时 (PC-4) 即指向当前指令的下一条指令地址。因此返回操作可以通过下面的指令来实现:MOV PC,LR 该指令将寄存器LR 中的值复制到程序计数器PC 中实现程序返回,同时将SPSR _mode 寄存器内容复制到当前程序状态寄存器CPSR 中。在指令预取时,如果目标地址是非法的,该指令将被标记成有问题的指令。这时,流水线上该指令之前的指令继续执行。当执行到该被标记成有问题的指令时,处理

8、器产生指令预取中止异常中断。当发生指令预取中止异常中断时,程序要返回到该有问题的指令处,重新读取并执行该指令。因此指令预取中止异常中断程序应该返回到产生该指令预取中止异常中断的指令处,而不是返回到发生中断的指令的下一条指令。指令预取中止异常中断是由当前执行的指令自身产生的,当指令预取中止异常中断产生时,程序计数器PC 的值还未更新,它指向当前指令后面第2 条指令 (对于 ARM 指令来说,它指向当前指令地址加8 个字节的w 位置;对于 Thumb 指令来说, 它指向当前指令地址加4 个字节的位置)。 当指令预取中止异常中断产生时,处理器将 (PC-4)值保存到异常模式下的寄存器LR_mode中

9、。这时 (PC-4) 即指向当前指令的下一条指令。因此返回操作可以通过下面的指令来实现:SUBS PC,LR,#4 该指令将寄存器LR 中的值减4 后,复制到程序计数器PC 中,实现程序返回,同时将SPSR_mode寄存器内容复制到当前程序状态寄存器CPSR 中。发生数据访问异常中断时,程序要返回到该有问题的指令处,重新访问该数据,因此数据访问异常中断应该返回到产生该数据访问中止异常中断的指令处,而不是当前指令的下一条指令。数据访问异常中断由当前执行的指令自身产生,当数据访问异常中断发生时,程序计数器pc 的值已经更新,它指向当前指令后面第3 条指令(对于ARM 指令,它指向当前指令地址加12

10、 字节的位置;对于Thumb 指令,它指向当前指令地址加6 字节的位置)。此时处理器将值(pc-4 )保存到 lr_abt 中,它指向当前指令后面第2 条指令,所以返回操作可以通过下面指令实现:subs pc, lr, #8 该指令将lr 中的值减8 后传给程序计数器pc 中,实现程序返回,同时将SPSR_abt寄存器内容复制到当前程序状态寄存器CPSR 中;通常处理器执行完当前指令后,查询IRQ 中断引脚,并查看是否允许IRQ 中断,如果某个中断引脚有效,并且系统允许该中断产生,处理器将产生IRQ 异常中断,当IRQ 异常中断产生时,程序计数器pc 的值已经更新,它指向当前指令后面第3 条指

11、令(对于ARM 指令,它指向当前指令地址加12 字节的位置;对于Thumb 指令,它指向当前指令地址加6 字节的位置),当IRQ 异常中断产生时,处理器将值(pc-4 )保存到IRQ 异常模式下的寄存器 lr_irq 中,它指向当前指令之后的第2 条指令,因此返回操作可以通过下面指令实现:subs pc, lr, #4 与 IRQ 异常中断一样,处理器执行完当前指令后,查询FIQ 中断引脚,并查看是否允许FIQ 中断,如果中断引脚有效,并且系统允许该中断产生,处理器将产生FIQ 异常中断,当FIQ 异常中断产生时,程序计数器pc 的值已经更新,它指向当前指令后面第3 条指令(对于 ARM 指令,它指向当前指令地址加12 字节的位置; 对于 Thumb指令,它指向当前指令地址加6 字节的位置),当FIQ 异常中断产生时,处理器将值(pc-4 )保存到IRQ 异常模式下的寄存器lr_fiq 中,它指向当前指令之后的第2 条指令, 因此返回操作可以通过下面指令实现:subs pc, lr, #4

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 资格认证/考试 > 其它考试类文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号