注意:这两种状态的切换,不会影响处理器的模式和寄存器状态1.1 切换状态
寄存器14 | 该寄存器作为子程序的链接寄存器。当分支指令(Branch)和连接指令(BL)执行时,这个寄存器保存R15的值.其他时候,可以被作为通用寄存器来使用。对应的寄存器有:R14_svc,R14_irq,R14_fiq,R14_abt,R14_und,他们都在对应的模式下保存R15的值 |
寄存器15 | 这个寄存器为程序计数器(PC)。在arm模式下,bits[1:0]是0,bits[31-2]保存PC。在thumb模式下,bit[0]为0,bits[31:1]保存PC |
寄存器16 | 这个寄存器是CPSR(当前程序状态寄存器)。它保存代码的各种flag和一些模式位 |
N | Z | C | V | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | - | I | F | T | M4 | M3 | M2 | M1 | M0 |
T | 当为1时,处理器运行在THUMB模式下,否则运行在ARM模式下。他将影响TBIT外部信号 |
中断禁止位 | I和F是中断禁止位。为1,则相应的禁止IRQ和FIQ |
模式位 | M4,M3,M2,M1,M0是模式位,如下表,只有下表出现的模式才是正确的模式,一旦程序设置了错误的模式,则会产生复位异常 |
保留位 | 剩下的位为保留位。 |
10000 | User | R7…R0,LR,SP,PC,CPSR | R14…R0,PC,CPSR |
10001 | FIQ | R7…R0,LR_fiq,SP_fiq,PC,CPSR,SPSR_fiq | R7…R0,R14_fiq…R8_fiq,PC,CPSR,SPSR_fiq |
10010 | IRQ | R7…R0,LR_irq,SP_irq,PC,CPSR,SPSR_irq | R12…R0,R14_irq,R13_irq,PC,CPSR,SPSR_iraq |
10011 | Supervisor | R7…R0,LR_svc,SP_svc,PC,CPSR,SPSR_svc | R12…R0,R14_svc,R13_svc,PC,CPSR,SPSR_svc |
10111 | Abort | R7…R0,LR_abt,SP_abt,PC,CPSR,SPSR_abt | R12…R0,R14_abt,R13_abt,PC,CPSR,SPSR_abt |
11011 | Undefined | R7…R0,LR_und,SP_und,PC,CPSR,SPSR_und | P12…R0,R14_und,R13_und,PC,CPSR |
11111 | System | R7…R0,LR,SP,PC,CPSR | R14…R0,PC,CPSR |
BL;MOV PC,R14 | PC+4 | PC+2 |
SWI;MOVS PC,R14_svc | PC+4 | PC+2 |
UDEF;MOVS PC,R14_und | PC+4 | PC+2 |
FIQ;SUBS PC,R14_fiq,#4 | PC+4 | PC+4 |
IRQ;SUBS PC,R14_irq,#4 | PC+4 | PC+4 |
PABT;SUBS PC,R14_abt,#4 | PC+4 | PC+4 |
DABT;SUBS PC,R14_abt,#8 | PC+8 | PC+8 |
RESET;NA | - | - |
0x00000000 | Rest | Supervisor |
0x00000004 | Undefined instruction | Undefined |
0x00000008 | Software Interrupt | Supervisor |
0x0000000C | Abort(prefetch) | Abort |
0x00000010 | Abort(data) | Abort |
0x00000014 | Reserved | Reserved |
0x00000018 | IRQ | IRQ |
0x0000001C | FIQ | FIQ |
注意:并不是所有的异常都能同时发生如果数据abort异常和FIQ异常同时发生,并且FIQ异常被允许,ARM920T进入数据abort异常处理程序,然后立刻去处理FIQ的异常。FIQ异常退出之后,继续在abort异常处理程序中执行。
未定义指令和软件中断异常他们是互斥的
更多回帖