关于ARM 汇编的一些疑问:

一、ARM 各种模式下都有独立的R13(R13、R13_svc、R13_irq......) ,那么程序在发生异常时是如何操作堆栈的呢?例如从用户模式跳到IRQ。。

进入IRQ时是将寄存器压入到R13_irq指向的堆栈空间,从IRQ模式返回时从R13_irq指向的堆栈空间弹出寄存器的值。

二、R14在程序发生转移的时候状态如何变化

BL指令在转移到子程序执行之前,将其下一条指令的地址拷贝到R14寄存器中。

对于异常中断来说由于各种异常中断响应的过程不同,因此保存在LR中的地址是不同的。大多数情况是LR=PC-8。所以各中断返回时的指令也不一样,指令如下:

异常类型      模式                中断向量           返回指令                       程序进入异常时LR值

未定义指令  未定义           0x00000004    MOVS    PC, R14_und           LR = PC-4

软件中断       SVC(管理)    0x000000008   MOVS   PC, R14_svc            LR= PC-4

取指中止       abt(中止)   0x00000000c    SUBS   PC, R14_abt, #4     LR = PC -8

数据中止       abt                0x000000010    SUBS   PC, R14_abt, #4    LR = PC - 8

IRQ中断        IRQ               0x000000018   SUBS    PC, R14_irq, #4     LR = PC - 8

FIQ中断         FIQ               0x00000001c    SUBS    PC, R14_fiq, #4    LR  = PC -8

 

三、CPSR在程序发生跳转,和中断的时候状态如何变化。

程序发生跳转的时候CPSR不会自动的被保存,而程序发生异常时例如从用户模式跳到IRQ模式时硬件自将CPSR的值拷贝到SPSR_irq中。中断返回时自动由硬件把SPSR_irq的值恢复到CPSR。

四、当前执行的指令与PC的关系 ARM7为三级流水线结构所以

ARM模式下 PC=当前执行的指令位置+8

THUMB模式: PC=当前执行的指令位置+4

 

五、异常发生时ARM做了哪些事情:

 

       未定义异常发生后处理器响应过程如下

1、把下一条指令的地址拷贝给LR(当前执行的指令为PC-8,所以LR=PC-4)

2、把程序状态寄存器CPSR拷贝给SPSR_und

3、强制进入未定义模式

4、强制进入ARM状态

5、跳转到PC=0x00000004处执行

6、禁止IRQ中断。

 

      软件中断异常发生后处理器响应过程如下

1、把下一条指令的地址拷贝给LR(当前执行的指令为PC-8,所以LR=PC-4)

2、把程序状态寄存器CPSR拷贝给SPSR_svc

3、强制进入管理模式

4、强制进入ARM状态

5、跳转到PC=0x00000008处执行

6、禁止IRQ中断。

 

 

       取指中止异常发生后处理器响应过程如下

1、把中断时PC的值拷贝给LR(LR=PC)

2、把程序状态寄存器CPSR拷贝给SPSR_abt

3、强制进入中止异常模式

4、强制进入ARM状态

5、跳转到PC=0x0000000C处执行

6、禁止IRQ中断。

 

     数据中止异常发生后处理器响应过程如下

1、把中断时PC的值拷贝给LR(LR=PC)

2、把程序状态寄存器CPSR拷贝给SPSR_abt

3、强制进入中止异常模式

4、强制进入ARM状态

5、跳转到PC=0x00000010处执行

6、禁止IRQ中断。

 

     IRQ异常发生后处理器响应过程如下

1、把中断时PC的值拷贝给LR(LR=PC)

2、把程序状态寄存器CPSR拷贝给SPSR_irq

3、强制进入IRQ模式

4、强制进入ARM状态

5、跳转到PC=0x00000018处执行

6、禁止IRQ中断。

 

     FIQ异常发生后处理器响应过程如下

1、把中断时PC的值拷贝给LR(LR=PC)

2、把程序状态寄存器CPSR拷贝给SPSR_fiq

3、强制进入FIQ模式

4、强制进入ARM状态

5、跳转到PC=0x00000018处执行

6、禁止IRQ中断。

7、禁止FIQ中断。