您的位置 首页 动态

ARM初始化Stack

1.简介ARM有7种运行Mode,每一种Mode的堆栈指针寄存器(SP)都是独立的。所以,对于程序中需要用的每一种处理器模式,都要给SP定义一个堆栈…

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的意图。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/dongtai/275626.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部