zoukankan      html  css  js  c++  java
  • arm中的栈

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

    2、对于 R13 寄存器来说,它对应6个不同的物理寄存器,其中的一个是用户模式与系统模式共用,另外5个物理寄存器对应于其他5种不同的运行模式。采用以下的记号来区分不同的物理寄存器:
    R13_<mode>
    其中,mode为以下几种模式之一:usr、fiq、irq、svc、abt、und。
    3、 寄存器R13在ARM指令中常用作堆栈指针,但这只是一种习惯用法,用户也可使用其他的寄存器作为堆栈指针。而在Thumb指令集中,某些指令强制性的要 求使用R13作为堆栈指针。由于处理器的每种运行模式均有自己独立的物理寄存器R13,在用户应用程序的初始化部分,一般都要初始化每种模式下的R13, 使其指向该运行模式的栈空间,这样,当程序的运行进入异常模式时,可以将需要保护的寄存器放入R13所指向的堆栈,而当程序从异常模式返回时,则从对应的 堆栈中恢复,采用这种方式可以保证异常发生后程序的正常执行。
    4、有四种类型的堆栈:

    堆栈是一种数据结构,按先进后出 (First In Last Out,FILO)的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。当堆栈指针指向最后压入堆栈的数据时,称为 满堆栈(Full Stack),而当堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈(Empty Stack)。

    同时,根据 堆栈的生成方式,又可以分为递增堆栈(Ascending Stack)和递减堆栈(DecendingStack),当堆栈由低地址向高地址生成时,称为递增堆栈,当堆栈由高地址向低地址生成时,称为递减堆栈。 这样就有四种类型的堆栈工作方式,ARM 微处理器支持这四种类型的堆栈工作方式,即:
    ◎ Full descending 满递减堆栈
    堆栈首部是高地址,堆栈向低地址增长。栈指针总是指向堆栈最后一个元素(最后一个元素是最后压入的数据)。
    ARM-Thumb过程调用标准和ARM、Thumb C/C++ 编译器总是使用Full descending 类型堆栈。

    ◎ Full ascending 满递增堆栈
    堆栈首部是低地址,堆栈向高地址增长。栈指针总是指向堆栈最后一个元素(最后一个元素是最后压入的数据)。指令如LDMFA,STMFA等。指令如LDMFD,STMFD等。

    ◎ Empty descending 空递减堆栈
    堆栈首部是低地址,堆栈向高地址增长。栈指针总是指向下一个将要放入数据的空位置。指令如LDMED,STMED等。
    ◎ Empty ascending 空递增堆栈
    堆栈首部是高地址,堆栈向低地址增长。栈指针总是指向下一个将要放入数据的空位置。指令如LDMEA,STMEA等。
    5、操作堆栈的汇编指令
    堆栈类型 入栈指令 出栈指令
    Full descending STMFD (STMDB) LDMFD (LDMIA)
    Full ascending STMFA (STMIB) LDMFA (LDMDA)
    Empty descending STMED (STMDA) LDMED (LDMIB)
    Empty ascending STMEA (STMIA) LDMEA (LDMDB)

    例子:
    STMFD r13!, {r0-r5} ; Push onto a Full Descending Stack
    LDMFD r13!, {r0-r5} ; Pop from a Full Descending Stack.

    之所以说“向上生长”和“向下生长”那是因为,一般画堆栈示意图都是把低地址画在下面,高地址画在上面。

    ARM中的堆栈 - 鹏举九宵 - 鹏举九霄的博客

          虽然ARM处理器核对于两种生长方式的堆栈均支持,但ADS的C语言编译器仅支持一种方式,即从上往下长,并且必须是满递减堆栈。所以STMFD等指令用的最多。


    来源于:http://www.armsystem.com.cn/bbs/viewthread.php?tid=323&highlight=  和http://hi.baidu.com/trical/blog/item/c614cf188b206a7ddab4bde2.html

  • 相关阅读:
    [置顶] Windows Phone后台音乐详解一
    Android应用开发学习笔记之BroadcastReceiver
    二维码闪电登录流程详解,附demo(1/2)
    C#利用Lambda和Expression实现数据的动态绑定
    从M个数中随机选出N个数的所有组合,有序,(二)
    3DShader之立方体环境映射(cubic environment mapping)
    二维码闪电登录流程详解,附demo(2/2)
    oracle 分区表exchange原理
    禁止页面复制功能 js禁止复制 禁用页面右键菜单
    sleep与信号唤醒的问题 & 内核对信号的处理方式
  • 原文地址:https://www.cnblogs.com/cdwodm/p/2965419.html
Copyright © 2011-2022 走看看