您的位置:首页 > 职场人生

关于ARM 汇编的一些疑问

2011-01-14 10:12 531 查看
关于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中断。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  职场 休闲 ARM