|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
1、寄存器 R13 在 ARM 指令中常用作堆栈指针
" V& {6 C( R3 N: m1 n$ ^7 s- y2、对于 R13 寄存器来说,它对应6个不同的物理寄存器,其中的一个是用户模式与系统模式共用,另外5个物理寄存器对应于其他5种不同的运行模式。采用以下的记号来区分不同的物理寄存器:
4 x( F3 E G3 eR13_8 `. |8 d. W- C0 J- J4 }' t' \
其中,mode为以下几种模式之一:usr、fiq、irq、svc、abt、und。
1 Z0 V7 X5 j4 f4 K3、寄存器R13在ARM指令中常用作堆栈指针,但这只是一种习惯用法,用户也可使用其他的寄存器作为堆栈指针。而在Thumb指令集中,某些指令强制性的要求使用R13作为堆栈指针。由于处理器的每种运行模式均有自己独立的物理寄存器R13,在用户应用程序的初始化部分,一般都要初始化每种模式下的R13,使其指向该运行模式的栈空间,这样,当程序的运行进入异常模式时,可以将需要保护的寄存器放入R13所指向的堆栈,而当程序从异常模式返回时,则从对应的堆栈中恢复,采用这种方式可以保证异常发生后程序的正常执行。
2 p/ N" t* [( L- e5 w4、有四种类型的堆栈:堆栈是一种数据结构,按先进后出(First In Last Out,FILO)的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。2 o3 u {" K& M& Y! L/ R7 y
当堆栈指针指向最后压入堆栈的数据时,称为满堆栈(Full Stack),而当堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈(Empty Stack)。
9 A9 K# j9 B" t5 d7 C) k" f8 e; t同时,根据堆栈的生成方式,又可以分为递增堆栈(Ascending Stack)和递减堆栈(DecendingStack),当堆栈由低地址向高地址生成时,称为递增堆栈,当堆栈由高地址向低地址生成时,称为递减堆栈。这样就有四种类型的堆栈工作方式,ARM 微处理器支持这四种类型的堆栈工作方式,即:
. f9 @+ {$ A$ b; N# f1 Q ~◎ Full descending 满递减堆栈
% B* m% b8 ]( {9 ]* M/ c( a堆栈首部是高地址,堆栈向低地址增长。栈指针总是指向堆栈最后一个元素(最后一个元素是最后压入的数据)。
# ~$ n$ ^1 S& UARM-Thumb过程调用标准和ARM、Thumb C/C++ 编译器总是使用Full descending 类型堆栈。
; s: u, u* D1 K* B; B◎ Full ascending 满递增堆栈" r0 O' J6 N _8 ^7 u' Z
堆栈首部是低地址,堆栈向高地址增长。栈指针总是指向堆栈最后一个元素(最后一个元素是最后压入的数据)。5 k1 m: o" a" ~. x
◎ Empty descending 空递减堆栈
$ z$ ~) @1 b, E5 [堆栈首部是低地址,堆栈向高地址增长。栈指针总是指向下一个将要放入数据的空位置。
L: t2 d9 g: U, ?9 l( p◎ Empty ascending 空递增堆栈
0 O- d+ f* ?2 [堆栈首部是高地址,堆栈向低地址增长。栈指针总是指向下一个将要放入数据的空位置。2 i/ `+ h7 g4 }% j7 r
& _ U3 S l9 S1 t2 _ s5、操作堆栈的汇编指令堆栈类型 入栈指令 出栈指令
# D! }0 p: L6 a' y) j/ pFull descending STMFD (STMDB) LDMFD (LDMIA)
/ O- g+ P3 S$ u2 yFull ascending STMFA (STMIB) LDMFA (LDMDA)7 Z8 F, s2 t* D R
Empty descending STMED (STMDA) LDMED (LDMIB)! A; c, h) v& s( r) |- s0 `
Empty ascending STMEA (STMIA) LDMEA (LDMDB)
/ L- j7 O2 S q例子:
8 v# k9 U6 b5 k; B! o3 v+ tSTMFD r13!, {r0-r5} ; Push onto a Full Descending Stack
' K3 p* i+ o+ N/ K. C; I5 l. P7 aLDMFD r13!, {r0-r5} ; Pop from a Full Descending Stack.7 H4 x$ C$ Q) L; a- ?
|
|