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

[复制链接]
3568|6
 楼主| gofayao 发表于 2007-3-21 00:07 | 显示全部楼层 |阅读模式
抄入书上内容如下:<br /><br />&nbsp;------------------------------------------------------------------<br />|&nbsp;异常或入口&nbsp;|&nbsp;&nbsp;&nbsp;返回指令&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;之前的状态&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;ARM&nbsp;r14_x&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;Thumb&nbsp;r14_x&nbsp;&nbsp;&nbsp;|<br />|------------|---------------------|--------------|----------------|<br />|&nbsp;&nbsp;BL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;MOV&nbsp;&nbsp;PC,R14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PC+4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;PC+2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<br />|------------|---------------------|--------------|----------------|<br />|&nbsp;&nbsp;SWI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;MOVS&nbsp;PC,R14_svc&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PC+4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;PC+2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<br />|------------|---------------------|--------------|----------------|<br />|&nbsp;&nbsp;未定义指令|&nbsp;&nbsp;MOVS&nbsp;PC,R14_und&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PC+4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;PC+2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<br />|------------|---------------------|--------------|----------------|<br />|&nbsp;&nbsp;预取指中止|&nbsp;&nbsp;SUBS&nbsp;PC,R14_abt,#4&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PC+4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;PC+4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<br />|------------|---------------------|--------------|----------------|<br />|&nbsp;&nbsp;FIQ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;SUBS&nbsp;PC,R14_fiq,#4&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PC+4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;PC+4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<br />|------------|---------------------|--------------|----------------|<br />|&nbsp;&nbsp;IRQ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;SUBS&nbsp;PC,R14_irq,#4&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PC+4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;PC+4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<br />|------------|---------------------|--------------|----------------|<br />|&nbsp;&nbsp;数据中止&nbsp;&nbsp;|&nbsp;&nbsp;SUBS&nbsp;PC,R14_abt,#4&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PC+8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;PC+8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<br />&nbsp;------------------------------------------------------------------<br /><br />Ps:表格内,那个“之前状态”栏的PC应该代表当前执行指令地址,而不是代表“预取指”的PC,这个是书上搞错了,好像很多书都比较混用这两个PC.<br /><br /><br />从上面这个表可以看出:<br />BL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;返回后执行BL的下一条指令<br />SWI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;返回后执行SWI的下一条指令<br />未定义指令&nbsp;&nbsp;&nbsp;返回后执行未定义指令的下一条指令<br />预取指中止&nbsp;&nbsp;&nbsp;返回后执行继续执行一遍预取指中止指令<br />FIQ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;返回后执行被FIQ中断的指令<br />IRQ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;返回后执行被IRQ中断的指令<br />数据中止&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;返回后执行数据中止指令的下一条指令<br /><br />疑问:<br />&nbsp;&nbsp;&nbsp;&nbsp;1.为什么&nbsp;&nbsp;数据中止异常&nbsp;r14值为PC+8,而不是PC+4呢?<br />&nbsp;&nbsp;&nbsp;&nbsp;2.为什么&nbsp;&nbsp;数据中止异常&nbsp;返回后是执行下一条指令,而不是和预取指中止&nbsp;一样重新执行一遍数据中止指令呢?<br /><br />望各位大侠&nbsp;讲解讲解,谢谢!!<br /><br /><br />
 楼主| gofayao 发表于 2007-3-21 00:09 | 显示全部楼层

......

  
xjc 发表于 2007-3-21 09:12 | 显示全部楼层

你的表格里面,

你的表格里面,<br />之前的状态好象有点问题哦。<br />
 楼主| gofayao 发表于 2007-3-21 09:59 | 显示全部楼层

应该是有问题.

表格内,那个&nbsp;“之前状态”&nbsp;栏的PC应该代表当前执行指令地址.
xjc 发表于 2007-3-21 10:30 | 显示全部楼层

异常中断的处理表格。

 楼主| gofayao 发表于 2007-3-21 11:29 | 显示全部楼层

To xjc

不会吧,怎么和我看的那本书,讲不一样呢...&nbsp;晕<br />
 楼主| gofayao 发表于 2007-3-21 12:02 | 显示全部楼层

应该这个才是正确的.

刚看了一下&nbsp;ADS&nbsp;developer&nbsp;guide,应该这个才是正确的.<br /><br />&nbsp;------------------------------------------------------------------<br />|&nbsp;异常或入口&nbsp;|&nbsp;&nbsp;&nbsp;返回指令&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;之前的状态&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<br />|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;ARM&nbsp;r14_x&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;Thumb&nbsp;r14_x&nbsp;&nbsp;&nbsp;|<br />|------------|---------------------|--------------|----------------|<br />|&nbsp;&nbsp;BL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;MOV&nbsp;&nbsp;PC,R14&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;当前指令+4&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;当前指令+2&nbsp;&nbsp;&nbsp;|<br />|------------|---------------------|--------------|----------------|<br />|&nbsp;&nbsp;SWI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;MOVS&nbsp;PC,R14_svc&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;当前指令+4&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;当前指令+2&nbsp;&nbsp;&nbsp;|<br />|------------|---------------------|--------------|----------------|<br />|&nbsp;&nbsp;未定义指令|&nbsp;&nbsp;MOVS&nbsp;PC,R14_und&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;当前指令+4&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;当前指令+2&nbsp;&nbsp;&nbsp;|<br />|------------|---------------------|--------------|----------------|<br />|&nbsp;&nbsp;预取指中止|&nbsp;&nbsp;SUBS&nbsp;PC,R14_abt,#4&nbsp;|&nbsp;当前指令+4&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;当前指令+4&nbsp;&nbsp;&nbsp;|<br />|------------|---------------------|--------------|----------------|<br />|&nbsp;&nbsp;FIQ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;SUBS&nbsp;PC,R14_fiq,#4&nbsp;|&nbsp;当前指令+4&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;当前指令+4&nbsp;&nbsp;&nbsp;|<br />|------------|---------------------|--------------|----------------|<br />|&nbsp;&nbsp;IRQ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;SUBS&nbsp;PC,R14_irq,#4&nbsp;|&nbsp;当前指令+4&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;当前指令+4&nbsp;&nbsp;&nbsp;|<br />|------------|---------------------|--------------|----------------|<br />|&nbsp;&nbsp;数据中止&nbsp;&nbsp;|&nbsp;&nbsp;SUBS&nbsp;PC,R14_abt,#8&nbsp;|&nbsp;当前指令+8&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;当前指令+8&nbsp;&nbsp;&nbsp;|<br />&nbsp;------------------------------------------------------------------<br /><br /><br />从上面这个表可以看出:<br />BL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;返回后执行BL的下一条指令<br />SWI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;返回后执行SWI的下一条指令<br />未定义指令&nbsp;&nbsp;&nbsp;返回后执行未定义指令的下一条指令<br />预取指中止&nbsp;&nbsp;&nbsp;返回后执行重新执行一遍预取指中止指令<br />FIQ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;返回后执行被FIQ中断的指令<br />IRQ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;返回后执行被IRQ中断的指令<br />数据中止&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;返回后执行重新执行一遍数据中止指令<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

34

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部