关于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。
未定义异常发生后处理器响应过程如下
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中断。