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