接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的效果是什么?假如删去,对程序的运转会有什么影响?
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/262730.html