|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
1、寄存器 R13 在 ARM 指令中常用作堆栈指针
3 e) a2 F8 w. {2、对于 R13 寄存器来说,它对应6个不同的物理寄存器,其中的一个是用户模式与系统模式共用,另外5个物理寄存器对应于其他5种不同的运行模式。采用以下的记号来区分不同的物理寄存器:
1 ~6 b, }, I& L7 oR13_
/ q# g9 s3 P% B% }+ J其中,mode为以下几种模式之一:usr、fiq、irq、svc、abt、und。
8 L- Y4 [* w. c: `$ M3、寄存器R13在ARM指令中常用作堆栈指针,但这只是一种习惯用法,用户也可使用其他的寄存器作为堆栈指针。而在Thumb指令集中,某些指令强制性的要求使用R13作为堆栈指针。由于处理器的每种运行模式均有自己独立的物理寄存器R13,在用户应用程序的初始化部分,一般都要初始化每种模式下的R13,使其指向该运行模式的栈空间,这样,当程序的运行进入异常模式时,可以将需要保护的寄存器放入R13所指向的堆栈,而当程序从异常模式返回时,则从对应的堆栈中恢复,采用这种方式可以保证异常发生后程序的正常执行。: O, j& }! W% @9 G
4、有四种类型的堆栈:堆栈是一种数据结构,按先进后出(First In Last Out,FILO)的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。# i l; |# L" @1 e0 n; y
当堆栈指针指向最后压入堆栈的数据时,称为满堆栈(Full Stack),而当堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈(Empty Stack)。6 Z! H, N5 y5 V% F" Q# N5 Q
同时,根据堆栈的生成方式,又可以分为递增堆栈(Ascending Stack)和递减堆栈(DecendingStack),当堆栈由低地址向高地址生成时,称为递增堆栈,当堆栈由高地址向低地址生成时,称为递减堆栈。这样就有四种类型的堆栈工作方式,ARM 微处理器支持这四种类型的堆栈工作方式,即:
. ]# F5 A: l/ h" F◎ Full descending 满递减堆栈 Z/ P% d& G# \/ H
堆栈首部是高地址,堆栈向低地址增长。栈指针总是指向堆栈最后一个元素(最后一个元素是最后压入的数据)。% v* P& ^# I- Y! K4 W8 T+ _5 {3 @$ {
ARM-Thumb过程调用标准和ARM、Thumb C/C++ 编译器总是使用Full descending 类型堆栈。
) s7 b' O( j5 D% ?, C% _, E◎ Full ascending 满递增堆栈
# S' ? o, ~* g( W! U, }堆栈首部是低地址,堆栈向高地址增长。栈指针总是指向堆栈最后一个元素(最后一个元素是最后压入的数据)。$ k; V( o1 E" a7 z3 a+ }
◎ Empty descending 空递减堆栈2 [1 ~: s; r' R2 i& q4 U- `4 [# N
堆栈首部是低地址,堆栈向高地址增长。栈指针总是指向下一个将要放入数据的空位置。
6 C6 R( F6 ^0 A) [7 R◎ Empty ascending 空递增堆栈
5 }( {/ m* l2 \2 C; C0 K堆栈首部是高地址,堆栈向低地址增长。栈指针总是指向下一个将要放入数据的空位置。, W& @7 X" P3 |3 h
4 B0 i! ~& x- Q5 @9 Y8 ~9 [5、操作堆栈的汇编指令堆栈类型 入栈指令 出栈指令; ~! A5 d* [) o* i
Full descending STMFD (STMDB) LDMFD (LDMIA)
% ~! X7 a @7 I" e, T/ FFull ascending STMFA (STMIB) LDMFA (LDMDA). Q1 c) M& ]; g0 E2 |
Empty descending STMED (STMDA) LDMED (LDMIB)/ S+ }" @' R ?( B: T% \" P! W+ M9 r
Empty ascending STMEA (STMIA) LDMEA (LDMDB)
; x8 y8 X' T' X Q例子:* \* c* [6 [+ X; j
STMFD r13!, {r0-r5} ; Push onto a Full Descending Stack$ a9 j7 O1 L4 w* s- n; T4 e
LDMFD r13!, {r0-r5} ; Pop from a Full Descending Stack.1 n& c# H! }* b Y8 u
|
|