抄入书上内容如下:
------------------------------------------------------------------ | 异常或入口 | 返回指令 | 之前的状态 | | | | 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.为什么 数据中止异常 返回后是执行下一条指令,而不是和预取指中止 一样重新执行一遍数据中止指令呢?
望各位大侠 讲解讲解,谢谢!!
|