单片机
返回首页

ARM处理器的工作模式 (二)

2016-04-19 来源:eefocus

接 ARM处理器的工作模式(一)
实验二 各工作模式下堆栈初始化实验(ARM9)(工程exp9,文件exp9_2_1.s)
本实验实现各工作模式下堆栈初始化,采用ARMmulator方式调试,选用ARM9作为目标处理器。
                AREA INIT_STACK,CODE,READONLY
                    ENTRY               ;工作于管理模式
START              MOV R1,#1           ;初始化R1      
                    BL INITSTACK       ;设置各模式下的堆栈指针
                                        ;回到用户模式下运行应用程序
MRS R1,CPSR        ;保存CPSR于R1
                    BIC R1,R1,#0x80           
                    MSR CPSR_cxsf,R1  
                    MSR CPSR_c,#0xd0
                    MRS R3,CPSR
                    BIC R3,R3,#0x80
                    MSR CPSR_cxsf,R3
                    MSR CPSR_c,#0xdf           ;切换至系统模式
STOP          B STOP
      
INITSTACK                                 ;初始化各种模式下的堆栈指针
                    MOV R0,LR              ;保存LR值8008,以待返回
                    LDR SP,P_SVC_STK       ;初始化堆栈指针SP_SVC&USR=809C
                    MSR CPSR_c,#0xd2       ;1101 0010,切换至外中断模式
                    LDR SP,P_IRQ_STK       ;初始化堆栈指针SP_IRQ=
                    
MSR CPSR_c,#0xd1      ;切换至快中断模式
                    LDR SP,P_FIQ_STK      ;初始化堆栈指针SP_IRQ=
                    STMED SP!,{R0,R1}    ;保护现场 R0,R1(存入相应的堆栈里面)
                    NOP
                  
                   MSR CPSR_c,#0xd7     ;切换到ABT        
                   LDR SP,P_ABT_STK
                   MSR CPSR_c,#0xdb     ;切换到UND
                   LDR SP,P_UND_STK
                   
                   MSR CPSR_c,#0xdf     ;切换到USR
                   LDR SP,P_USR_STK
                   
                   MOV PC,R0           ;返回原程序
                
;定义各个工作模式下的堆栈长度
USR_STK_LEN EQU 4
SVC_STK_LEN EQU 4
IRQ_STK_LEN EQU 4
FIQ_STK_LEN EQU 4
ABT_STK_LEN EQU 4
UND_STK_LEN EQU 4
 
;定义各工作模式下的堆栈指针
P_USR_STK DCDUSR_STK_SPC+(USR_STK_LEN-1)*4
P_SVC_STK DCD SVC_STK_SPC+(SVC_STK_LEN-1)*4
P_IRQ_STK DCD IRQ_STK_SPC+(IRQ_STK_LEN-1)*4
P_FIQ_STK DCD FIQ_STK_SPC+(FIQ_STK_LEN-1)*4
P_ABT_STK DCD ABT_STK_SPC+(ABT_STK_LEN-1)*4
P_UND_STK DCD UND_STK_SPC+(UND_STK_LEN-1)*4
 
;定义各工作模式下的堆栈空间
                    AREA STACKS,DATA,READWRITE
USR_STK_SPC SPACE USR_STK_LEN*4
SVC_STK_SPC SPACE SVC_STK_LEN*4
IRQ_STK_SPC SPACE IRQ_STK_LEN*4
FIQ_STK_SPC SPACE FIQ_STK_LEN*4
ABT_STK_SPC SPACE ABT_STK_LEN*4
UND_STK_SPC SPACE UND_STK_LEN*4
 
                    END
 
 
1.         单步运行程序,列出本实验的指令执行情况表,统计程序设计的相关寄存器以及存储空间上的相关地址,并记录程序运行过程中这些寄存器、存储空间相关地址上的变化情况,同时记录ARM工作模式的变化情况。
2.         根据本实验的执行结果,并结合ARM反汇编表的信息,画出ARM各模式的堆栈空间分配图,标出各模式堆栈的起始地址、堆栈长度以及堆栈指针的位置。
3.         如何实现各种工作模式下的堆栈初始化
序号 执行指令 指令执行后的变化情况
    寄存器&存储空间 工作模式
                       
0                      
1                      
2                      
3                      
4                      
5                      
6                      
7                      
8                      
9                      
10                      
11                      
12                      
13                      
                       
 
 
 
 
START    [0xe3a01001]   mov      r1,#1
00008004       [0xeb000008]   bl       INITSTACK
00008008       [0xe10f1000]   mrs      r1,cpsr
0000800c      [0xe3c11080]   bic      r1,r1,#0x80
00008010       [0xe12ff001]   msr      cpsr_cxsf,r1
00008014       [0xe321f0d0]   msr      cpsr_c,#0xd0
00008018       [0xe10f3000]   mrs      r3,cpsr
0000801c      [0xe3c33080]   bic      r3,r3,#0x80
00008020       [0xe12ff003]   msr      cpsr_cxsf,r3
00008024       [0xe321f0df]   msr      cpsr_c,#0xdf
STOP          [0xeafffffe]         STOP
INITSTACK   [0xe1a0000e]   mov      r0,r14
00008030       [0xe59fd034]   ldr      r13,P_SVC_STK ; = #P_SVC_STK
00008034       [0xe321f0d2]   msr      cpsr_c,#0xd2
00008038       [0xe59fd030]   ldr      r13,P_IRQ_STK ; = #P_IRQ_STK
0000803c           [0xe321f0d1]   msr      cpsr_c,#0xd1
00008040       [0xe59fd02c]   ldr      r13,P_FIQ_STK ; = #P_FIQ_STK
00008044       [0xe82d0003]   stmed    r13!,{r0,r1}
00008048       [0xe1a00000]   nop     
0000804c      [0xe321f0d7]   msr      cpsr_c,#0xd7
00008050       [0xe59fd020]   ldr      r13,P_ABT_STK ; = #P_ABT_STK
00008054       [0xe321f0db]   msr      cpsr_c,#0xdb
00008058       [0xe59fd01c]   ldr      r13,P_UND_STK ; = #P_UND_STK
0000805c      [0xe321f0df]   msr      cpsr_c,#0xdf
00008060       [0xe59fd000]   ldr      r13,P_USR_STK ; = #P_USR_STK
00008064       [0xe1a0f000]   mov      pc,r0
;定义各工作模式下的堆栈指针
P_USR_STK00008068 [0x0000808c]   dcd      0x0000808c  ....
P_SVC_STK0000806C [0x0000809c]   dcd      0x0000809c  ....
P_IRQ_STK00008070  [0x000080ac]   dcd      0x000080ac  ....
P_FIQ_STK00008074  [0x000080bc]   dcd      0x000080bc  ....
P_ABT_STK00008078 [0x000080cc]   dcd      0x000080cc  ....
P_UND_STK0000807C       [0x000080dc]   dcd      0x000080dc  ....
;定义各工作模式下的堆栈空间
USR_STK_SPC00008080    [0x00000000]   dcd      0x00000000  ....
00008084                   [0x00000000]   dcd      0x00000000  ....
00008088                   [0x00000000]   dcd      0x00000000  ....
0000808c                       [0x00000000]   dcd      0x00000000  ....
SVC_STK_SPC00008090   [0x00000000]   dcd      0x00000000  ....
00008094                   [0x00000000]   dcd      0x00000000  ....
00008098                   [0x00000000]   dcd      0x00000000  ....
0000809c                  [0x00000000]   dcd      0x00000000  ....
IRQ_STK_SPC000080a0   [0x00000000]   dcd      0x00000000  ....
000080a4                  [0x00000000]   dcd      0x00000000  ....
000080a8                  [0x00000000]   dcd      0x00000000  ....
000080ac       [0x00000000]   dcd      0x00000000  ....
FIQ_STK_SPC     [0x00000000]   dcd      0x00000000  ....
000080b4       [0x00000000]   dcd      0x00000000  ....
000080b8       [0x00000000]   dcd      0x00000000  ....
000080bc       [0x00000000]   dcd      0x00000000  ....
ABT_STK_SPC    [0x00000000]   dcd      0x00000000  ....
000080c4       [0x00000000]   dcd      0x00000000  ....
000080c8       [0x00000000]   dcd      0x00000000  ....
000080cc [0x00000000]   dcd      0x00000000  ....
UND_STK_SPC   [0x00000000]   dcd      0x00000000  ....
000080d4       [0x00000000]   dcd      0x00000000  ....
000080d8       [0x00000000]   dcd      0x00000000  ....
000080dc       [0x00000000]   dcd      0x00000000  ....
实验思考题:
1.         如果把实验一的程序运行于实际ARM系统中,运行的结果会是怎样?
2.         实验二的程序中,子程序INITSTACK的第一行代码MOV R0,LR的作用是什么?如果删除,对程序的运行会有什么影响?
进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 离子检测器电路分析

  • 非常简单的150W功放电路图

  • 如何使用LED驱动器LM3915制作振动计

  • 分享一个电网倾角计电路

  • 使用NE555和磁簧开关的橱柜照明电路

  • 电谐波图形均衡器示意图

    相关电子头条文章