原创 ARM汇编学习实例2

2009-3-21 10:21 4502 4 4 分类: MCU/ 嵌入式

 AREA Block,CODE,READONLY<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


;程序入口标志


       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,#0x<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />1F ;清除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


R8R14 是分组寄存器。它们存取的物理寄存器取决于当前的处理器模式。若要存取特定的物理寄存器而不依赖当前的处理器模式,则要使用规定的各字。


寄存器R8~R12 各有两组物理寄存器:一组为FIQ 模式,另一组为除了FIQ以外的所有模式。寄存器R8~R12 没有任何指定的特殊用途。只是使用R8~R14来简单地处理中断。寄存器R13,R14 各有6 个分组的物理寄存器。1 个用于用户模式和系统模式,其它5 个分别用于5 种异常模式。寄存器R13 通常用做堆迭指标,称为SP。每种异常模式都有自己的R13。寄存器R14 用作子程序链接寄存器,也称为LR


3) 程序计数器R15


寄存器R15 用做程序计数器(PC)。程序状态寄存器在所有处理器模式下都可以存取当前的程序状态寄存器CPSRCPSR 包含条件码标志位,中断禁止位,当前处理器模式以及其它状态和控制信息。每种异常模式都有一个程序状态保存寄存器SPSR。当例外出现时,SPSR 用于保留CPSR的状态。


CPSR SPSR 的格式如下:


条件码标志:NZCV 大多数指令可以测试这些条件码标志以决定程序指令如何执行


控制位:最低8 IFT 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 所示。


 
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
4
关闭 站长推荐上一条 /4 下一条