ARM汇编语言指令(1)

ARM 248浏览
  • Handling Processor Exception

Exception
Description
Reset
复位中断,中断向量在0x0000
Undefined Instruction
un-recognized executing instruction
Software Interrupt(SWI)
用户中断,提供了在用户模式下请求执行监控模式功能的方法,示例调用RTOS function
Prefetch Abort
用于地址非法,导致了处理器不能执行取址
Data Abort
到数据传输时,loadstore地址非法
IRQ
外部中断发生(低电平有效)
FIQ
Fast Interrupt Requset发生(低电平有效)
 
通常情况下,应用运行于用户模式,但是异常处理需要运行于特权模式(即非用户模式),异常模式能够访问如下寄存器:
该模式下的r13或Stack Pointer(sp_mode)
该模式下的r14或Link Register(lr_mode)
该模式下的Saved Program Status Register(spsr_mode)
在FIQ模式下,还能够方位r8_FIQ-r12_FIQ。
 
  • 中断优先级

Vector address
Exception type
Exception mode
Priority(1=H, 6=Low)
0x0
Reset
Supervisor(SVC)
1
0x4
Undefined Instruction
Undef
6
0x8
Software Interrupt(SWI)
Supervisor(SVC)
6
0xC
Prefetch Abort
Abort
5
0x10
Data Abort
Abort
2
0x14
Reserved
Not application
Not application
0x18
Interrupt(IRQ)
Interrupt(IRQ)
4
0x1C
Fast Interrupt(FIQ)
Fast Interrupt(FIQ)
3
 
  • 进入异常处理
将CPSR拷贝到SPSR,在SPSR中保存the current mode,interrupt mask及condition flags。改变CPSR到合适的模式,map in the appropriate banked register for that mode。其它异常发生时,屏蔽IRQ;在FIQ和reset发生时,屏蔽FIQ。将中断返回地址存入到lr_mode。将PC指向中断向量表中指定的地址。
 
  • 基本概念
ARM:Advanced RISC Machines
RISC:Reduced Instruction Set Computer(精简指令集)
 
ARM支持7种处理器模式,正常情况下,程序在用户模式下执行,当软件异常或硬件中断发生时,进入相应的处理器模式。

 

处理器模式
说明
Visible Thumb state registers
Visible ARM state registers
User用户
正常程序执行模式
R7..R0, LR, SP, PC, CPSR
R14..R0, PC, CPSR
FIQ
支持高速数据传送或通道处理
R7..R0LR_fiq, SP_fiq,
PC, CPSR, SPSR_fiq
R7..R0, R14_fiq..R8_fiq,
PC, CPSR, SPSR_fiq
IRQ
通用中断处理
R7..R0LR_irq, SP_irq,
PC, CPSR, SPSR_irq
R12..R0R14_irq, R13_irq, PC, CPSR, SPSR_irq
Supervisor(svc)
操作系统保护模式
R7..R0LR_svc, SP_svc, PC,
CPSR, SPSR_svc
R12..R0, R14_svc,R13_svc
PC, CPSR, SPSR_svc
Abort
实现虚拟存储/存储器保护
R7..R0LR_abt, SP_abt, PC,
CPSR, SPSR_abt
R12..R0R14_abt, R13_abt, PC, CPSR, SPSR_abt
Undefined
支持硬件辅助计算器的软件仿真
R7..R0LR_und, SP_und,
PC, CPSR, SPSR_und
R12..R0R14_und, R13_und, PC, CPSR
System
执行操作系统工作
R7..R0LR, SP, PC, CPSR
R14..R0, PC, CPSR
 
通常情况下,程序执行于用户模式,如果发生外部中断IRQ,就进入IRQ处理器模式,这时使用分组寄存器r13_irq和r14_irq,而不是使用r13和r14。R15是程序计数器PC,它指向正在取指的指令而不是正在执行的指令。由于ARM7中的三条流水线,读取的PC指针,总是比当前执行的汇编代码的地址多8。
        mov pc, pc
这条指令将使程序跳转到当前指令的下下条指令(即跳过一条指令)执行程序。
        sub, pc, pc, #4
执行的是下一条指令
        sub, pc, pc, #8
则是一条死循环
R14:当执行带链接分支的指令BL时,得到R15的副本
R13:作为堆栈指针(SP),通常在BOOT程序里把R13初始化为指向异常模式分配的堆栈。

对未定义模式堆栈进行初始化
UNDEFMODE                  DEFINE                  0x1b(00011011)
MODEMASK                    DEFINE                  0x1f(00001111)
NOINT                               DEFINE                  0xc0(11000000)
 
mrs   r0, cpsr                       
bic         r0, r0, #MODEMASK                ;cpsr的低4位清零
orr         r1, r0, #UNDEFMODE | NOINT
msr        cpsr_cxsf, r1
ldr         sp, =UndefStack                ;把堆栈的位置送给SP      

 

ARM处理器支持程序状态寄存器存取指令,用于程序状态寄存器和通用寄存器之间交换内容。

MRS:程序状态寄存器到通用寄存器的数据传递指令
MSR:通用寄存器到程序状态寄存器的数据传递指令
由于ARMr14来保存子程序的返回地址而不需要调用堆栈获得,故ARM的子程序调用很快。