1. 简介
ARM有7种运转Mode,每一种Mode的仓库指针寄存器(SP)都是独立的。
所以,关于程序中需求用的每一种处理器形式,都要给SP界说一个仓库地址。
初始化流程为:
修正状况寄存器内的状况位,使处理器切换到需求的形式
给SP赋值。
留意:
不要切换到User形式进行该形式下的仓库设置,由于进入User形式后就不能再操作CPSR返回到其他形式了。
===============================
先界说各种形式对应的CPSR寄存器M[4:0]的值,该值决议了进入何种形式,可参阅相关数据手册。
Mode_USR EQU 0x10
Mode_FIQ EQU 0x11
Mode_IRQ EQU 0x12
Mode_SVC EQU 0x13
Mode_ABT EQU 0x17
Mode_UND EQU 0x1B
Mode_SYS EQU 0x1F
I_BIT EQU 0x80 ; when I bit is set (1), IRQ is disabled
F_BIT EQU 0x40 ; when F bit is set (1), FIQ is disabled
下面是初始化仓库的代码段:
InitStack
MOV R0, LR
; /* 设置管理形式仓库 */
MSR CPSR_c, #(Mode_SVC | I_BIT | F_BIT) ; 0xd3
LDR SP,StackSvc
; /* 设置间断形式仓库 */
MSR CPSR_c, #(Mode_IRQ | I_BIT | F_BIT); 0xd2
LDR SP,StackIrq
; /* 设置快速间断形式仓库 */
MSR CPSR_c, #(Mode_FIQ | I_BIT | F_BIT); 0xd1
LDR SP,StackFiq
; /* 设置间断形式仓库 */
MSR CPSR_c, #(Mode_ABT | I_BIT | F_BIT); 0xd7
LDR SP,StackAbt
; /* 设置未界说形式仓库 */
MSR CPSR_c, #(Mode_UND | I_BIT | F_BIT); 0xdb
LDR SP,StackUnd
; /*设置体系形式仓库*/
MSR CPSR_c, #(Mode_SYS | I_BIT | F_BIT); 0xdf
LDR SP,StackUsr
MOV PC, R0
StackUsr DCD UsrStackSpace + (USR_STACK_LEGTH – 1) * 4
StackSvc DCD SvcStackSpace + (SVC_STACK_LEGTH – 1)* 4
StackIrq DCD IrqStackSpace + (IRQ_STACK_LEGTH – 1)* 4
StackFiq DCD FiqStackSpace + (FIQ_STACK_LEGTH – 1)* 4
StackAbt DCD AbtStackSpace + (ABT_STACK_LEGTH – 1)* 4
StackUnd DCD UndtStackSpace + (UND_STACK_LEGTH – 1)* 4
; /* 分配仓库空间 */
AREA MyStacks, DATA, NOINIT, ALIGN=2
UsrStackSpace SPACE USR_STACK_LEGTH * 4 ;用户(体系)形式仓库空间
SvcStackSpace SPACE SVC_STACK_LEGTH * 4 ;管理形式仓库空间
IrqStackSpace SPACE IRQ_STACK_LEGTH * 4 ;间断形式仓库空间
FiqStackSpace SPACE FIQ_STACK_LEGTH * 4 ;快速间断形式仓库空间
AbtStackSpace SPACE ABT_STACK_LEGTH * 4 ;间断义形式仓库空间
UndtStackSpace SPACE UND_STACK_LEGTH * 4 ;未界说形式仓库
===============================
以管理形式仓库空间为例阐明一下:
SVC_STACK_LEGTH 界说为 16 ,分配成果为:分配16个4字节的存储空间,把该存储空间初始化为0,而且把SP指向仓库底部(内存高位)。
从上面memory的内容上面能够看出。管理形式仓库分配了从0x00008080~0x00008044 总共16*4字节空间。其间0x00008040地址存储器上放置的是0x00008080,也便是该仓库底部的指针的值。
便是说,StackSvc DCD SvcStackSpace + (SVC_STACK_LEGTH – 1)* 4 这条32位的伪指令,通过编译后,是在0x00008040(StackSvc)地址上放置SvcStackSpace地址值(0x00008080)。也便是把0x00008080赋给了SP了。
再看看地址0x00008080~0x00008044 上的内容,全部是andeq r0,r0,r0。
从汇编指令格局来翻译,andeq r0,r0,r0翻译成16制止代码后,刚好是0x00000000。然后到达仓库空间清0的意图。