以下是我在学习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、有四种类型的仓库:仓库是一种数据结构,按先进后出(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 满递加仓库
仓库首部是低地址,仓库向高地址增加。栈指针总是指向仓库最终一个元素(最终一个元素是最终压入的数据)。
◎ 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.