AREA Block,CODE,READONLY
;程序入口标志
ENTRY
start
B Reset_Handler
Undefined_Handler
B Undefined_Handler
B SWI_Handler
Prefetch_Handler
B Prefetch_Handler
Abort_Handler
B Abort_Handler
NOP ;空操作
IRQ_Handler
B IRQ_Handler
FIQ_Handler
B FIQ_Handler
SWI_Handler
mov pc, lr
;前面部分是处理程序,主要处理各种模式的入端口跳移
Reset_Handler
;into System mode
MRS R0,CPSR ;复制CPSR 到R0
BIC R0,R0,#0x1F ;清除R0 的后5 位
ORR R0,R0,#0x1F ;设定R0 的最后5 位为11111
MSR CPSR_c,R0 ;把R0 装载到CPSR,切换到系统模式
MOV R0, #1 ;对系统模式下的R0 赋值,下面的R1~R15 一样
MOV R1, #2
MOV R2, #3
MOV R3, #4
MOV R4, #5
MOV R5, #6
MOV R6, #7
MOV R7, #8
MOV R8, #9
MOV R9, #10
MOV R10, #11
MOV R11, #12
MOV R12, #13
MOV R13, #14
MOV R14, #15
;into FIQ mode
MRS R0,CPSR
BIC R0,R0,#0x1F
ORR R0,R0,#0x11 ;设定R0 的最后5 位为10001
MSR CPSR_c,R0 ;把R0 装载到CPSR,切换到Fiq 模式
MOV R8, #16 ;给Fiq 模式的特有缓存器R8 赋值, 下面的R9~R14 一样
MOV R9, #17
MOV R10, #18
MOV R11, #19
MOV R12, #20
MOV R13, #21
MOV R14, #22
;into SVC mode
MRS R0,CPSR
BIC R0,R0,#0x1F
ORR R0,R0,#0x13 ;设定R0 的最后5 位为10011
MSR CPSR_c,R0 ;把R0 装载到CPSR,切换到Svc 模式
MOV R13, #23 ;给SVC 模式的特有缓存器R13 赋值, 下面的R14 一样
MOV R14, #24
;into Abort mode
MRS R0,CPSR
BIC R0,R0,#0x1F
ORR R0,R0,#0x17 ;设定R0 的最后5 位为10111
MSR CPSR_c,R0 ;把R0 装载到CPSR,切换到Abort 模式
MOV R13, #25 ;给Abort 模式的特有缓存器R13 赋值, 下面的R14 一样
MOV R14, #26
;into IRQ mode
MRS R0,CPSR
BIC R0,R0,#0x1F
ORR R0,R0,#0x12 ;设定R0 的最后5 位为10010
MSR CPSR_c,R0 ;把R0 装载到CPSR,切换到IRQ 模式
MOV R13, #27 ;给IRQ 模式的特有缓存器R13 赋值, 下面的R14一样
MOV R14, #28
;into UNDEF mode
MRS R0,CPSR
BIC R0,R0,#0x1F
ORR R0,R0,#0x1b ;设定R0 的最后5 位为11011
MSR CPSR_c,R0 ;把R0 装载到CPSR,切换到UNDEF 模式
MOV R13, #29 ;给UNDEF 模式的特有缓存器R13 赋值, 下面的R14 一样
MOV R14, #30
B Reset_Handler ;跳移到最开始地方循环
END
通过此实验,我们发现在AXD中,current 显示的是当前模式下的可访问的寄存器组,注意各种模式的切换方法。通过此例让我们更清楚的知道了,寄存器组的结构以及如何去用好此寄存器。
1)不分组寄存器R0~R7
R0~R7 是不分组寄存器。这意味着在所有处理器模式下,它们都存取一样的32 位寄存器。它们是真正的通用寄存器,没有架构所隐含的特殊用途。
2)分组寄存器R8~R14
R8~R14 是分组寄存器。它们存取的物理寄存器取决于当前的处理器模式。若要存取特定的物理寄存器而不依赖当前的处理器模式,则要使用规定的各字。
寄存器R8~R12 各有两组物理寄存器:一组为FIQ 模式,另一组为除了FIQ以外的所有模式。寄存器R8~R12 没有任何指定的特殊用途。只是使用R8~R14来简单地处理中断。寄存器R13,R14 各有6 个分组的物理寄存器。1 个用于用户模式和系统模式,其它5 个分别用于5 种异常模式。寄存器R13 通常用做堆迭指标,称为SP。每种异常模式都有自己的R13。寄存器R14 用作子程序链接寄存器,也称为LR。
3) 程序计数器R15
寄存器R15 用做程序计数器(PC)。程序状态寄存器在所有处理器模式下都可以存取当前的程序状态寄存器CPSR。CPSR 包含条件码标志位,中断禁止位,当前处理器模式以及其它状态和控制信息。每种异常模式都有一个程序状态保存寄存器SPSR。当例外出现时,SPSR 用于保留CPSR的状态。
CPSR 和SPSR 的格式如下:
条件码标志:N,Z,C,V 大多数指令可以测试这些条件码标志以决定程序指令如何执行
控制位:最低8 位I,F,T 和M 位用做控制位。当异常出现时改变控制位。当处理器在特权模式下也可以由软件改变。
中断禁止位:I 置1 则禁止IRQ 中断。F 置1 则禁止FIQ 中断。T 位:T=0 指示ARM 执行。T=1 指示Thumb 执行。在这些架构系统中,可自由地使用能在ARM 和Thumb 状态之间切换的指令。
模式位:M0, M1, M2, M3 和M4 (M[4:0]) 是模式位.这些位决定处理器的工作模式.如表2-1 所示。