找回密码
 注册
关于网站域名变更的通知
查看: 344|回复: 3
打印 上一主题 下一主题

ARM的栈与栈指令

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-9-29 13:42 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
一、定义:栈(Stack)是限定仅在一端进行插入或删除操作的线性表。
8 ]1 O7 y6 E* x- K' I* P因此,对栈来说,可以进行插入或删除操作的一端端称为栈顶(top),相应地,另一端称为栈底(bottom)。不含元素的空表称为空栈。由于堆栈只允许在一端进行操作,因而按照后进先出(LIFO-Last In First Out)的原理运作。从栈顶的定义来看,栈顶的位置是可变的。空栈时,栈顶和栈底重合;满栈时,栈顶离栈底最远。ARM为堆栈提供了硬件支持,它使用一个专门的寄存器(堆栈指针)指向堆栈的栈顶。而且7种模式都有各自独立的堆栈指针,也就是有各自独立的堆栈空间。
0 Y+ p- m% \' a' z" x. v4 @6 ]二、如何描述一个栈
- M+ b$ K/ Y  W+ B准确描述一个栈的特点需要两个参数4 |. t' h* x8 y! x2 w' y8 ]
栈地址的增长方向:ARM将向高地址增长(也叫做向上增长)的栈称为递增栈(ascendant Stack),将向低地址增长(也叫做向下增长)的栈称为递减栈(descendantStack)
2 z! D/ h6 D% b栈指针的指向位置:ARM将栈指针指向栈顶元素位置的栈称为满栈(Full Stack),讲栈指针指向即将入栈的元素位置的栈称为空栈(Empty Stack)8 Q5 W2 R' y3 L- X0 _8 }
根据栈地址增长方向雨栈指针指向位置的不同,自然可以将栈分为四类:
, q- K* r- `9 U
" w# D1 V; T0 P* G. x& z' ]下图描述了四种不同类型的栈,其中虚线部分表示即将入栈的元素。
6 F8 _9 q+ t, K" |* J* ~9 _6 G2 `
  Z2 e9 @4 m  ~2 x
三、栈指令- w$ j" M/ @9 ]0 [2 X- U3 D4 u+ T
栈的操作指令无非两种:入栈和出栈,由于ARM描述了四种不同类型的栈,因此对应的栈指令一共有8条。

% I$ j- W- F5 y. H& USTM:(STore Multiple data)表示存储数据,即入栈。1 ?  c& B. R( v; s" t/ k. L  i+ K; e% a
LDM:(LoaD Multiple data)表示加载数据,即出栈。) j/ k. h. F8 v7 D% L$ c
一般情况下,可以将栈操作指令分解为两步微指令:数据存取和栈指针移动。这两步操作的先后顺序和栈指针的移动方式由栈的类型决定。$ D3 m+ [" }$ @9 H" O# v
; R! k. e2 x" a2 c/ z8 O% f
ARM中存在一组缓冲区操作指令和栈指令是一一对应的,他们完成相同的功能。这些指令含义的区别来源于对存取操作的缓冲区指针地址增长方向,以及存取操作和缓冲区指针移动的先后顺序决定的。这个和前面描述的栈类型的分类原则十分相似。+ w, o! D. J; T2 l1 X. b* R) j* k
  r1 f% C8 u3 u& C
四、实例
* o2 d9 S) ?" {, T虽然ARM的栈类型和相关的操作指令比较繁琐,但是实际上最常用的还是和x86指令集相同的栈类型:栈向低地址方向增长,且栈指针指向栈顶元素的位置,即ARM的FD栈。因此最常见的ARM栈指令操作是STMFD和LDMFD。
+ \; u& u7 a$ v3 [7 @" P& {7 b例如入栈指令:
! i& V' v% o( xSTMFD SP,{R0-R3}( u; K0 @$ v4 G, ~+ X2 N( H
实际的微指令操作为:# V2 C+ }# F  f: ]0 `
[SP-4]  <=  R3+ ?, y) I9 S+ Z6 p, B
[SP-8]  <=  R25 q! }4 K& V; G; b9 v" Q8 p8 ^
[SP-12] <=  R1
& {% h" `8 K) c; X3 ^# h[SP-16] <=  R0
7 @- T9 x0 Z8 A8 {" N0 T在ARM的指令系统中,递减栈入栈操作的参数入栈顺序是从右到左依次入栈,而参数的出栈顺序则是从左到右的逆操作。对于递增栈,相应的操作则全部取反。 ' N6 [+ q- P1 O
例如出栈指令:/ w+ n- M& F0 S5 ~; c
LDMFD SP,{R4-R7}$ `: R& U& h& u
实际的微指令操作为:8 k4 y) P7 D4 N7 o% s% \& q( N
[SP]    =>  R41 ~. v5 ^6 L% g; J
[SP+4]  =>  R5* n# F$ a4 ?. U( a. [
[SP+8]  =>  R61 a# [4 b! z( ?: M
[SP+12] =>  R7' E4 ~; y1 j0 w* U
上述的入栈和出栈指令其实仅仅对栈做了存取操作,并未真正改变SP指针的值。正常情况下,我们希望对栈操作后能自动修改栈指针SP的值,使用如下指令可以达到该目的。4 S5 q3 u9 Q3 X" w
STMFD SP!,{R0-R3}
7 T& ]& H$ h6 i/ r" I3 {对应的微指令操作为:, ^0 h1 d8 G* U; S' V
[SP-4]  <=  R3: e& E9 U/ U2 `+ X3 k0 R9 C' @
[SP-8]  <=  R2
  \6 t+ U" v5 R6 x8 n! F! ^1 O( S) M3 T[SP-12] <=  R1% x3 J/ A, `% @" M
[SP-16] <=  R0
: f$ Z8 `7 G2 D) J  C# v* lSP      =  SP - 16
, H0 e2 v; n4 X1 f( @2 f同样的:: U5 G( T% W  j8 V) T, r, p
LDMFD SP!,{R4-R7}
& C  C- Q- i/ P. L6 p7 E$ u对应的微指令操作为:! K9 {2 o1 g6 A
[SP]    =>  R47 _+ v9 f2 W- G! u$ I% x: g* x) }
[SP+4]  =>  R5
. p  k9 v: |9 x! W[SP+8]  =>  R6
  |2 S& O# H: M) b$ U4 Y" _# H[SP+12] =>  R7
" g  D5 X1 ]/ }8 K! C( s" nSP      =  SP + 16! Q' b0 ]6 ?, O3 p

6 z. ?5 h" A! z0 v2 Z' l
8 a# V/ R& y7 _& W

该用户从未签到

2#
发表于 2021-9-29 14:09 | 只看该作者
在ARM的指令系统中,递减栈入栈操作的参数入栈顺序是从右到左依次入栈,而参数的出栈顺序则是从左到右的逆操作

该用户从未签到

3#
发表于 2021-9-29 16:08 | 只看该作者
一般情况下,可以将栈操作指令分解为两步微指令:数据存取和栈指针移动

该用户从未签到

4#
发表于 2021-9-29 16:22 | 只看该作者
ARM描述了四种不同类型的栈,因此对应的栈指令一共有8条
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-24 01:22 , Processed in 0.156250 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表