学习ARM过程中的堆栈初始化详解

发布者:静逸心境最新更新时间:2021-01-29 来源: eefocus关键字:ARM  堆栈初始化  寄存器 手机看文章 扫描二维码
随时随地手机看文章

1、寄存器R13在ARM指令中常用作堆栈指针

2、对于R13寄存器来说,它对应6个不同的物理寄存器,其中的一个是用户模式与系统模式共用,另外5个物理寄存器对应于其他5种不同的运行模式。采用以下的记号来区分不同的物理寄存器:

R13_

其中,mode为以下几种模式之一:usr、fiq、irq、svc、abt、und。


3、寄存器R13在ARM指令中常用作堆栈指针,但这只是一种习惯用法,用户也可使用其他的寄存器作为堆栈指针。而在Thumb指令集中,某些指令强制性的要求使用R13作为堆栈指针。由于处理器的每种运行模式均有自己独立的物理寄存器R13,在用户应用程序的初始化部分,一般都要初始化每种模式下的R13,使其指向该运行模式的栈空间,这样,当程序的运行进入异常模式时,可以将需要保护的寄存器放入R13所指向的堆栈,而当程序从异常模式返回时,则从对应的堆栈中恢复,采用这种方式可以保证异常发生后程序的正常执行。


4、有四种类型的堆栈:

堆栈是一种数据结构,按先进后出(FirstInLastOut,FILO)的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。

当堆栈指针指向最后压入堆栈的数据时,称为满堆栈(FullStack),而当堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈(EmptyStack)。

同时,根据堆栈的生成方式,又可以分为递增堆栈(AscendingStack)和递减堆栈(DecendingStack),当堆栈由低地址向高地址生成时,称为递增堆栈,当堆栈由高地址向低地址生成时,称为递减堆栈。这样就有四种类型的堆栈工作方式,ARM微处理器支持这四种类型的堆栈工作方式,即:

◎Fulldescending满递减堆栈

堆栈首部是高地址,堆栈向低地址增长。栈指针总是指向堆栈最后一个元素(最后一个元素是最后压入的数据)。

ARM-Thumb过程调用标准和ARM、ThumbC/C++编译器总是使用Fulldescending类型堆栈。

◎Fullascending满递增堆栈

堆栈首部是低地址,堆栈向高地址增长。栈指针总是指向堆栈最后一个元素(最后一个元素是最后压入的数据)。


◎Emptydescending空递减堆栈

堆栈首部是低地址,堆栈向高地址增长。栈指针总是指向下一个将要放入数据的空位置。


◎Emptyascending空递增堆栈

堆栈首部是高地址,堆栈向低地址增长。栈指针总是指向下一个将要放入数据的空位置。


5、操作堆栈的汇编指令

堆栈类型入栈指令出栈指令

FulldescendingSTMFD(STMDB)LDMFD(LDMIA)

FullascendingSTMFA(STMIB)LDMFA(LDMDA)

EmptydescendingSTMED(STMDA)LDMED(LDMIB)

EmptyascendingSTMEA(STMIA)LDMEA(LDMDB)

例子:

STMFDr13!,{r0-r5};PushontoaFullDescendingStack

LDMFDr13!,{r0-r5};PopfromaFullDescendingStack.


关键字:ARM  堆栈初始化  寄存器 引用地址:学习ARM过程中的堆栈初始化详解

上一篇:ARM 单片机新手入门问答
下一篇:新手福利:ARM常用概念须知

推荐阅读最新更新时间:2024-11-11 00:30

如何选择合适的ARM芯片
目前国内市场常见的ARM有NXP(Philips)、Samsung、Atmel、TI、ADI等,根据用户要求及应用领域。 可从如下几个方面选型: 1、速度(常规应用):ARM7的主时钟为20~133M,ARM9为100~233M,ARM10高达700M,如果速度要求更高,还可使用多核ARM,如MinSpeed公司的ARM系列芯片。 2、内存(常规应用):一般ARM都内带Flash(程序)和SRAM(数据),Atmel公司的ARM自带内存容量最大。如果要扩充外部SDRAM,Atmel、Samsung、NXP均可。 3、MCU升级(常规应用):如果是从原来的单片机系统升级(速度、GPIO等),可选择NXP的ARM,该公司的ARM性
[单片机]
如何选择合适的<font color='red'>ARM</font>芯片
ARM反汇编学习
在bin文件中,就是一条条的机器指令,每条指令4个字节。 在ADS中打开一个.s文件,选择project- disassemble 可以看到汇编的机器码 汇编代码如下(ADS中的一个例程ARMADSv1_2Examplesasmarmex.s): AREA ARMex, CODE, READONLY ; name this block of code ENTRY ; mark first instruction ; to execute start MOV r0, #10 ; Set up parameters MOV r1, #3 ADD r0, r0, r1 ; r0 = r0 + r1 stop MOV r0, #0x1
[单片机]
<font color='red'>ARM</font>反汇编学习
arm ldm stm指令解析
这里比较下容易混淆的四条指令,已经在这4条指令的混淆上花费了很多精力,现在做个小结,LDR,STR,LDM,STM这四条指令,关于LDM和STM的说明,见另外一个说明文件,说明了这两个文件用于栈操作时的注意事项。 (1)LDR:L表示LOAD,LOAD的含义应该理解为:Load from memory into register。下面这条语句就说明的很清楚: LDR R1, R1 —— 就是把R2所指向的存储单元的内容的值(一个memory地址内的值),读取到R1中(一个register) (2)STR:S表示STORE,STORE的含义应该理解为:Store from a register into memory。
[单片机]
ARM笔记: U-Boot移植
U-Boot移植: 系统:Ubuntu 12.04 开发板:JZ2440 虚拟机:VM10.04 U-Boot:U-BOOT-1.1.6 步骤: 1、解压U-BOOT-1.1.6 tar jxvf U-BOOT-1.1.6.tar.bz2 2、同时支持S3C2410和S3C2440: (1)、新建一个开发板的相应目录和文件 在board目录下将smdk2410复制为100ask24x0,并将board/100ask24x0/smdk2410.c改名为100ask24x0.c,再将include/configs/smdk2410.h复制为100ask24x0.h 修改两个Makefile: 1)、在顶层Makefile中增加如个两行
[单片机]
ARM处理器架构异常/中断处理
中断是我们嵌入式开发很常用到的一种资源和编程手段。这篇文章重点分析arm的中断处理流程。 首先,中断是异常的一种。当发生一种异常时,处理器会进入不同的工作模式。ARM的异常和相应的模式之间的对应关系见下表: 当一个异常导致模式的改变时,ARM核自动地: 1、把cpsr保存到相应模式下的spsr 2、把pc保存到相应模式下的lr 3、设置cpsr为相应异常模式 4、设置pc为相应异常处理程序的入口地址 对于IRQ或者FIQ而言,还多一项变化:禁用相关的中断IRQ或FIQ,禁止同类型的其他中断被触发。(这也是自动实现的,因此正常情况下,ARM中断不可嵌套) 从异常中断处理程序退出时,需要我们在程序中用软
[单片机]
<font color='red'>ARM</font>处理器架构异常/中断处理
移植ethtool到arm平台
首先下载ethtool的源码包。 剩下的事情,几条命令搞定。 tar -xzf ethtool-3.15.tar.gz cd ethtool-3.15 ./configure --host=arm-linux CC=arm-none-linux-gnueabi-gcc LDFLAGS=-static make cp ethtool /path/to/rootfs/bin/
[单片机]
理解ARM中断原理以及中断嵌套
ARM有七种模式,我们这里值讨论SVC、IRQ和FIQ模式 usr(用户模式)、fiq(快速中断模式)、irq(中断模式)、svc(管理模式)、abt(数据访问终止模式)、sys(系统模式)、und(未定义指令中止模式) ① 我们假设ARM核心有两根中断引脚(实际上是看不见的),一根叫irq pin,一根叫fiq pin。在ARM的cpsr中,有一个I位和一个F位,分别用来禁止IRQ和FIQ ② 先不说中断控制器,只说ARM核心。正常情况下,ARM核都只是机械地随着pc的指示去做事情,当CPSR中的I和F位为1时,IRQ和FIQ全部处于禁止状态。无论你在irq pin和fiq pin上面发什么样的中断信号,ARM不会理你,
[单片机]
理解<font color='red'>ARM</font>中断原理以及中断嵌套
7.ARM处理器的工作模式
ARM七种工作模式:图1-1: 图1-1 上面的七种工作模式可以在cpsr设置:如下的M =Mode number。 图1-2 之所以要有这么多种模式,是为了避免致命的错误。例如我们写的应用程序运行在User模式,操作系统的运作在比较高的模式。 User模式:普通程序运行的模式。 FIQ:快速中断运行的模式 RIQ:普通中断运行的模式 Supervisor:特权模式 Abort:访问内存异常等 Undefined:未定义模式,数据未定义。 System:系统模式 Linux对于用户程序是运行在User模式,内核运行在Supervisor模式。
[单片机]
7.<font color='red'>ARM</font>处理器的工作模式
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved