关于 PC指针问题

根据《ARM微控制器基础与实践》第2页对指令流水线的说明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    ;当EINT1在此处发生中断,LR=当前PC(即当前指令"执行PC"+8)
    mov r0,#0    ;
EINT1_Handler  
    subs PC,LR,#4    ;LR=LR-4中断返回;即返回到中断时"当前PC"-4位置(即当前指令("执行PC"+8)-4);即返回到子函数调用指令的下一条指令(mov r0,#0;)处

但如何理解P393页软中断的汇编接口:
例程(3)
    TST    R3,#T_bit        ;判断是ARM指令集还是Thumb指令集
    LDRNEH    R0,[LR,#-2]        ;是Thumb指令集,取SWI中断时执行的指令(即C语言__SWI(0x00)指令)
    BICNE    R0,R0,#0XFF00        ;取软中断功能号
    LDREQ    R0,[LR,#-4]        ;是ARM指令集,取SWI中断时执行的指令(即C语言__SWI(0x00)指令)
    BIC    R0,R0,#0XFF000000    ;取软中断功能号
问题1:LDREQ    R0,[LR,#-4];取的是执行C语言__SWI(0x00)指令时"当前PC-4";而它指向的应该是SWI中断返回的位置,而不是SWI指令本身?
问题2:BIC    R0,R0,#0XFF000000    ;取软中断功能号;该指令的执行一定和生成ARM代码规则相关,但书中并无相关介绍 答 1:
re:当前"取指PC"=当前PC
当前"译码PC"=当前PC-4
当前"执行PC"=当前PC-8
=========
在三级流水线下上面的描述及其容易理解,流水线增多后似乎不太合适讲,但在ARM架构下记住这点就行了,也是最重要的:当前"执行PC"=当前PC-8。

问题1:LDREQ    R0,[LR,#-4];取的是执行C语言__SWI(0x00)指令时"当前PC-4";而它指向的应该是SWI中断返回的位置,而不是SWI指令本身?

:执行C语言__SWI(0x00)指令时,指令地址=当前PC-8
:保存LR时会有个自动调整:LR=PC-4(从你的举例1来看应该以及知道这一点了),所以LR=当前PC-4=SWI指令地址+8-4=当前PC-8__SWI(0x00)指令地址+4
:然后再取LR-4=当前PC-8__SWI(0x00)指令地址+4-4=SWI指令

问题2:BIC    R0,R0,#0XFF000000    ;取软中断功能号;该指令的执行一定和生成ARM代码规则相关,但书中并无相关介绍

:去看SWI指令格式编码,机器码编码中除了开头几位的条件标识和指令码之外,余下的就是软中断号了

 

 

异常中断返回的几种情况
ARM体系结构与编程 清华大学出版社 杜春雷 第九章异常中断处理

我的理解如下:

1.SWI和和未定义指令异常中断的返回:
指令地址
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
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)处重新执行,所以返回指令为
SUBS PC, LR,#4(PC=A=LR-4)

4,数据访问中止异常中断处理的返回:

指令地址
A          PC-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)

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值