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 递减堆栈( Decending Stack   当堆栈由低地址向高地址生成时,称为递增堆栈 当堆栈由高地址向低地址生成时,称为递减堆栈。 这样就有四种类型的堆栈工作方式,  ARM 微处理器支持这四种类型的堆栈工作方式,即:
  满递减堆栈Full descending) :堆栈首部是高地址,堆栈向低地址增长。栈指针总是指向堆栈最后一个元素(最后一个元素是最后压入的数据)。 ARM-Thumb过程调用标准和ARMThumbC/C++编译器总是使用Full descending类型堆栈。
  满递增堆栈( Full ascending ):堆栈首部是低地址,堆栈向高地址增长。栈指针总是指向堆栈最后一个元素(最后一个元素是最后压入的数据)。
  空递减堆栈( Empty descending) :堆栈首部是低地址,堆栈向高地址增长。栈指针总是指向下一个将要放入数据的空位置。
  空递增堆栈( Empty ascending) :堆栈首部是高地址,堆栈向低地址增长。栈指针总是指向下一个将要放入数据的空位置。

   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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值