新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM處理器的工作模式 (二)

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

        作者: 時間:2016-11-21 來源:網絡 收藏
        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] b 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的作用是什么?如果刪除,對程序的運行會有什么影響?


        關鍵詞: ARM處理器工作模

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 台南县| 五河县| 三亚市| 凌源市| 桦甸市| 雷州市| 石楼县| 洛阳市| 芒康县| 长岛县| 定陶县| 万宁市| 兴宁市| 韶关市| 浠水县| 丰原市| 东丽区| 平罗县| 榕江县| 洛阳市| 延寿县| 遵化市| 永仁县| 延津县| 特克斯县| 乌兰浩特市| 和顺县| 湾仔区| 舟山市| 金昌市| 松溪县| 南川市| 台湾省| 同江市| 纳雍县| 班玛县| 屏边| 阿瓦提县| 安陆市| 鱼台县| 阜南县|