打印

请教,关于异常时PC值保存的问题

[复制链接]
2017|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gofayao|  楼主 | 2007-3-21 00:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
抄入书上内容如下:

 ------------------------------------------------------------------
| 异常或入口 |   返回指令          |          之前的状态           |
|            |                     |  ARM r14_x   |  Thumb r14_x   |
|------------|---------------------|--------------|----------------|
|  BL        |  MOV  PC,R14        |     PC+4     |   PC+2         |
|------------|---------------------|--------------|----------------|
|  SWI       |  MOVS PC,R14_svc    |     PC+4     |   PC+2         |
|------------|---------------------|--------------|----------------|
|  未定义指令|  MOVS PC,R14_und    |     PC+4     |   PC+2         |
|------------|---------------------|--------------|----------------|
|  预取指中止|  SUBS PC,R14_abt,#4 |     PC+4     |   PC+4         |
|------------|---------------------|--------------|----------------|
|  FIQ       |  SUBS PC,R14_fiq,#4 |     PC+4     |   PC+4         |
|------------|---------------------|--------------|----------------|
|  IRQ       |  SUBS PC,R14_irq,#4 |     PC+4     |   PC+4         |
|------------|---------------------|--------------|----------------|
|  数据中止  |  SUBS PC,R14_abt,#4 |     PC+8     |   PC+8         |
 ------------------------------------------------------------------

Ps:表格内,那个“之前状态”栏的PC应该代表当前执行指令地址,而不是代表“预取指”的PC,这个是书上搞错了,好像很多书都比较混用这两个PC.


从上面这个表可以看出:
BL           返回后执行BL的下一条指令
SWI          返回后执行SWI的下一条指令
未定义指令   返回后执行未定义指令的下一条指令
预取指中止   返回后执行继续执行一遍预取指中止指令
FIQ          返回后执行被FIQ中断的指令
IRQ          返回后执行被IRQ中断的指令
数据中止     返回后执行数据中止指令的下一条指令

疑问:
    1.为什么  数据中止异常 r14值为PC+8,而不是PC+4呢?
    2.为什么  数据中止异常 返回后是执行下一条指令,而不是和预取指中止 一样重新执行一遍数据中止指令呢?

望各位大侠 讲解讲解,谢谢!!


相关帖子

沙发
gofayao|  楼主 | 2007-3-21 00:09 | 只看该作者

......

使用特权

评论回复
板凳
xjc| | 2007-3-21 09:12 | 只看该作者

你的表格里面,

你的表格里面,
之前的状态好象有点问题哦。

使用特权

评论回复
地板
gofayao|  楼主 | 2007-3-21 09:59 | 只看该作者

应该是有问题.

表格内,那个 “之前状态” 栏的PC应该代表当前执行指令地址.

使用特权

评论回复
5
xjc| | 2007-3-21 10:30 | 只看该作者

异常中断的处理表格。

使用特权

评论回复
6
gofayao|  楼主 | 2007-3-21 11:29 | 只看该作者

To xjc

不会吧,怎么和我看的那本书,讲不一样呢... 晕

使用特权

评论回复
7
gofayao|  楼主 | 2007-3-21 12:02 | 只看该作者

应该这个才是正确的.

刚看了一下 ADS developer guide,应该这个才是正确的.

 ------------------------------------------------------------------
| 异常或入口 |   返回指令          |          之前的状态           |
|            |                     |  ARM r14_x   |  Thumb r14_x   |
|------------|---------------------|--------------|----------------|
|  BL        |  MOV  PC,R14        | 当前指令+4   |   当前指令+2   |
|------------|---------------------|--------------|----------------|
|  SWI       |  MOVS PC,R14_svc    | 当前指令+4   |   当前指令+2   |
|------------|---------------------|--------------|----------------|
|  未定义指令|  MOVS PC,R14_und    | 当前指令+4   |   当前指令+2   |
|------------|---------------------|--------------|----------------|
|  预取指中止|  SUBS PC,R14_abt,#4 | 当前指令+4   |   当前指令+4   |
|------------|---------------------|--------------|----------------|
|  FIQ       |  SUBS PC,R14_fiq,#4 | 当前指令+4   |   当前指令+4   |
|------------|---------------------|--------------|----------------|
|  IRQ       |  SUBS PC,R14_irq,#4 | 当前指令+4   |   当前指令+4   |
|------------|---------------------|--------------|----------------|
|  数据中止  |  SUBS PC,R14_abt,#8 | 当前指令+8   |   当前指令+8   |
 ------------------------------------------------------------------


从上面这个表可以看出:
BL           返回后执行BL的下一条指令
SWI          返回后执行SWI的下一条指令
未定义指令   返回后执行未定义指令的下一条指令
预取指中止   返回后执行重新执行一遍预取指中止指令
FIQ          返回后执行被FIQ中断的指令
IRQ          返回后执行被IRQ中断的指令
数据中止     返回后执行重新执行一遍数据中止指令

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

34

帖子

0

粉丝