关于ARM 汇编的一些疑问:ide
1、ARM 各类模式下都有独立的R13(R1三、R13_svc、R13_irq......) ,那么程序在发生异常时是如何操做堆栈的呢?例如从用户模式跳到IRQ。。spa
进入IRQ时是将寄存器压入到R13_irq指向的堆栈空间,从IRQ模式返回时从R13_irq指向的堆栈空间弹出寄存器的值。it
2、R14在程序发生转移的时候状态如何变化class
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 -8margin
数据停止 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
3、CPSR在程序发生跳转,和中断的时候状态如何变化。
程序发生跳转的时候CPSR不会自动的被保存,而程序发生异常时例如从用户模式跳到IRQ模式时硬件自将CPSR的值拷贝到SPSR_irq中。中断返回时自动由硬件把SPSR_irq的值恢复到CPSR。
4、当前执行的指令与PC的关系 ARM7为三级流水线结构因此
ARM模式下 PC值=当前执行的指令位置+8。
THUMB模式: PC值=当前执行的指令位置+4。
未定义异常发生后处理器响应过程以下
一、把下一条指令的地址拷贝给LR(当前执行的指令为PC-8,因此LR=PC-4)
二、把程序状态寄存器CPSR拷贝给SPSR_und
三、强制进入未定义模式
四、强制进入ARM状态
五、跳转到PC=0x00000004处执行
六、禁止IRQ中断。
软件中断异常发生后处理器响应过程以下
一、把下一条指令的地址拷贝给LR(当前执行的指令为PC-8,因此LR=PC-4)
二、把程序状态寄存器CPSR拷贝给SPSR_svc
三、强制进入管理模式
四、强制进入ARM状态
五、跳转到PC=0x00000008处执行
六、禁止IRQ中断。
取指停止异常发生后处理器响应过程以下
一、把中断时PC的值拷贝给LR(LR=PC)
二、把程序状态寄存器CPSR拷贝给SPSR_abt
三、强制进入停止异常模式
四、强制进入ARM状态
五、跳转到PC=0x0000000C处执行
六、禁止IRQ中断。
数据停止异常发生后处理器响应过程以下
一、把中断时PC的值拷贝给LR(LR=PC)
二、把程序状态寄存器CPSR拷贝给SPSR_abt
三、强制进入停止异常模式
四、强制进入ARM状态
五、跳转到PC=0x00000010处执行
六、禁止IRQ中断。
IRQ异常发生后处理器响应过程以下
一、把中断时PC的值拷贝给LR(LR=PC)
二、把程序状态寄存器CPSR拷贝给SPSR_irq
三、强制进入IRQ模式
四、强制进入ARM状态
五、跳转到PC=0x00000018处执行
六、禁止IRQ中断。
FIQ异常发生后处理器响应过程以下
一、把中断时PC的值拷贝给LR(LR=PC)
二、把程序状态寄存器CPSR拷贝给SPSR_fiq
三、强制进入FIQ模式
四、强制进入ARM状态
五、跳转到PC=0x00000018处执行
六、禁止IRQ中断。
七、禁止FIQ中断。