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

来源:本站
导读:目前正在解读《学习ARM过程中的堆栈初始化详解》的相关信息,《学习ARM过程中的堆栈初始化详解》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《学习ARM过程中的堆栈初始化详解》的详细说明。
简介:学习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、有四种类型的堆栈:

堆栈是一种数据结构,按先进后出(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过程中的堆栈初始化详解》最后刷新时间 2024-03-14 01:10:17,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《学习ARM过程中的堆栈初始化详解》该内容的真实性请自行鉴别。