|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
一、定义:栈(Stack)是限定仅在一端进行插入或删除操作的线性表。( h& x0 C1 j; h) s6 y
因此,对栈来说,可以进行插入或删除操作的一端端称为栈顶(top),相应地,另一端称为栈底(bottom)。不含元素的空表称为空栈。由于堆栈只允许在一端进行操作,因而按照后进先出(LIFO-Last In First Out)的原理运作。从栈顶的定义来看,栈顶的位置是可变的。空栈时,栈顶和栈底重合;满栈时,栈顶离栈底最远。ARM为堆栈提供了硬件支持,它使用一个专门的寄存器(堆栈指针)指向堆栈的栈顶。而且7种模式都有各自独立的堆栈指针,也就是有各自独立的堆栈空间。5 k; A4 g$ I6 u
二、如何描述一个栈9 T9 f# ?' x' z3 e9 U
准确描述一个栈的特点需要两个参数 h5 O/ O$ {, w
栈地址的增长方向:ARM将向高地址增长(也叫做向上增长)的栈称为递增栈(ascendant Stack),将向低地址增长(也叫做向下增长)的栈称为递减栈(descendantStack)
) [; {6 n4 }% H7 P栈指针的指向位置:ARM将栈指针指向栈顶元素位置的栈称为满栈(Full Stack),讲栈指针指向即将入栈的元素位置的栈称为空栈(Empty Stack). z) n0 {; K4 Q. R) Z
根据栈地址增长方向雨栈指针指向位置的不同,自然可以将栈分为四类:
) u# Y$ T6 O1 v
! k3 q$ x! e2 v& E* _下图描述了四种不同类型的栈,其中虚线部分表示即将入栈的元素。
& q* |6 p; E+ b8 a
+ Z4 W. ?" s) w1 j* _9 [1 h: q
三、栈指令( g' l( d" a' l3 {# o1 J
栈的操作指令无非两种:入栈和出栈,由于ARM描述了四种不同类型的栈,因此对应的栈指令一共有8条。
* k( k% y/ [0 }/ zSTM:(STore Multiple data)表示存储数据,即入栈。
# r" G3 J# {/ t- w( Y HLDM:(LoaD Multiple data)表示加载数据,即出栈。: s4 R4 o. f" a' r
一般情况下,可以将栈操作指令分解为两步微指令:数据存取和栈指针移动。这两步操作的先后顺序和栈指针的移动方式由栈的类型决定。
+ b# y# z4 e) t. q0 _ {1 k3 X! j6 I+ F
ARM中存在一组缓冲区操作指令和栈指令是一一对应的,他们完成相同的功能。这些指令含义的区别来源于对存取操作的缓冲区指针地址增长方向,以及存取操作和缓冲区指针移动的先后顺序决定的。这个和前面描述的栈类型的分类原则十分相似。
$ y$ H- e% A/ ^5 @3 M/ S' I
' E: G$ ]* ^- ]& W: R/ G1 i四、实例
5 Q% V! `6 w5 J2 j5 D/ W S; k9 s虽然ARM的栈类型和相关的操作指令比较繁琐,但是实际上最常用的还是和x86指令集相同的栈类型:栈向低地址方向增长,且栈指针指向栈顶元素的位置,即ARM的FD栈。因此最常见的ARM栈指令操作是STMFD和LDMFD。4 A# k5 b% B/ a: w9 B; i% I" w% u
例如入栈指令:
0 Z! u6 I+ W: n! O! PSTMFD SP,{R0-R3}7 I7 Q9 ?* V! I" O6 G% T' G- o
实际的微指令操作为:: L y" ^4 q# D
[SP-4] <= R3
`4 d, |. t+ W- F[SP-8] <= R2" H+ q6 T2 q8 k6 u
[SP-12] <= R1
1 E4 M/ ?! S; B4 ^6 C, w[SP-16] <= R0* T6 P$ O! O) Y( P
在ARM的指令系统中,递减栈入栈操作的参数入栈顺序是从右到左依次入栈,而参数的出栈顺序则是从左到右的逆操作。对于递增栈,相应的操作则全部取反。
" k0 D! A7 m, C/ n例如出栈指令:+ O- r0 u1 }! N6 G) u$ }
LDMFD SP,{R4-R7}. G# a% B! e' I8 \$ X# ~
实际的微指令操作为:# V2 L% C% B# [" G
[SP] => R45 C/ M4 I* E" P9 @ V5 U
[SP+4] => R5" w9 u9 R: k+ d0 {1 n$ j6 S
[SP+8] => R6% Y+ K6 A% c P n
[SP+12] => R7: O! T, e2 g) U- S. h
上述的入栈和出栈指令其实仅仅对栈做了存取操作,并未真正改变SP指针的值。正常情况下,我们希望对栈操作后能自动修改栈指针SP的值,使用如下指令可以达到该目的。, s) N& K* ?! U- ]/ c4 Y* H( [9 C
STMFD SP!,{R0-R3}
/ Q/ ^* |6 I7 [. k/ z) T, J) z5 G对应的微指令操作为:* F* C i: h; q' c& {( \- d
[SP-4] <= R3; c9 n) V8 P6 n! y
[SP-8] <= R27 k& a K# x2 G& l2 c- w* X
[SP-12] <= R1
8 ?+ [' f, {# }3 u E[SP-16] <= R0+ t( \& S0 g% [3 D
SP = SP - 16
& S4 u+ r2 K {8 K, U3 |; u同样的:7 k: F! ] L+ J8 b
LDMFD SP!,{R4-R7}
- D3 F" g8 P, k. x0 y& E对应的微指令操作为:
, O3 J3 Y$ {! T5 U[SP] => R40 @- J5 N+ Y: ]1 y9 v, p+ [
[SP+4] => R5
0 L; E' ?# t% Z' Z8 L, ?# O[SP+8] => R6
0 ]6 `( t- r+ N5 Q[SP+12] => R7' A) v! B/ R2 k& b
SP = SP + 168 E: q: e% r, z- K% w; n
- T& Y& n3 H: q* K. T2 R- I1 R9 O
+ y2 n8 @6 q8 J) {2 S; K1 N |
|