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

ARM的栈与栈指令

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
一、定义:栈(Stack)是限定仅在一端进行插入或删除操作的线性表。
4 E  Q' d/ [+ {/ o' T$ I因此,对栈来说,可以进行插入或删除操作的一端端称为栈顶(top),相应地,另一端称为栈底(bottom)。不含元素的空表称为空栈。由于堆栈只允许在一端进行操作,因而按照后进先出(LIFO-Last In First Out)的原理运作。从栈顶的定义来看,栈顶的位置是可变的。空栈时,栈顶和栈底重合;满栈时,栈顶离栈底最远。ARM为堆栈提供了硬件支持,它使用一个专门的寄存器(堆栈指针)指向堆栈的栈顶。而且7种模式都有各自独立的堆栈指针,也就是有各自独立的堆栈空间。1 T$ m: [* ~3 N. R! X2 L0 U% S: c
二、如何描述一个栈- I: U# e  p: t) o. _
准确描述一个栈的特点需要两个参数
7 @8 U4 ^/ B; I栈地址的增长方向:ARM将向高地址增长(也叫做向上增长)的栈称为递增栈(ascendant Stack),将向低地址增长(也叫做向下增长)的栈称为递减栈(descendantStack)
) Y4 x/ X7 _  |' n栈指针的指向位置:ARM将栈指针指向栈顶元素位置的栈称为满栈(Full Stack),讲栈指针指向即将入栈的元素位置的栈称为空栈(Empty Stack)
4 J  R8 m) k; ^4 K/ p4 _7 J) a8 C: }根据栈地址增长方向雨栈指针指向位置的不同,自然可以将栈分为四类:. i6 T. F) P2 `2 Q+ Z
3 x: d1 P8 p, J. O
下图描述了四种不同类型的栈,其中虚线部分表示即将入栈的元素。
/ F& r0 p: }. L, p3 u! ?  ^

0 t. u' l; ]3 O0 `三、栈指令
% D' S6 J0 G3 E1 t4 G' c栈的操作指令无非两种:入栈和出栈,由于ARM描述了四种不同类型的栈,因此对应的栈指令一共有8条。

6 y* E% \& K& I% Y; Q% eSTM:(STore Multiple data)表示存储数据,即入栈。0 L. }; R2 G6 `
LDM:(LoaD Multiple data)表示加载数据,即出栈。3 o" Y! N5 T5 v8 z" \4 L
一般情况下,可以将栈操作指令分解为两步微指令:数据存取和栈指针移动。这两步操作的先后顺序和栈指针的移动方式由栈的类型决定。
$ b! t8 W( h& _! _, _3 t) r& S7 O! f! @6 T
ARM中存在一组缓冲区操作指令和栈指令是一一对应的,他们完成相同的功能。这些指令含义的区别来源于对存取操作的缓冲区指针地址增长方向,以及存取操作和缓冲区指针移动的先后顺序决定的。这个和前面描述的栈类型的分类原则十分相似。
5 R1 w, y. J5 |; g$ ~8 m) N# `9 ~
% Z6 {% h3 P2 n+ \2 b四、实例
  u! V' _+ u% r& V* n# o+ z虽然ARM的栈类型和相关的操作指令比较繁琐,但是实际上最常用的还是和x86指令集相同的栈类型:栈向低地址方向增长,且栈指针指向栈顶元素的位置,即ARM的FD栈。因此最常见的ARM栈指令操作是STMFD和LDMFD。1 e! b" q$ H& P1 A% z3 [- {
例如入栈指令:
: J3 A- _, s, v% x2 HSTMFD SP,{R0-R3}- w3 a; y. S0 ~5 q
实际的微指令操作为:
8 k3 R# F% k% g! j7 m& E, k, E[SP-4]  <=  R3
: R" \9 H) \( k4 A' s[SP-8]  <=  R28 x+ q1 M: k: @+ R+ ?
[SP-12] <=  R1
/ g  x) [" v4 L9 u$ n[SP-16] <=  R06 X. \0 h. Q: E3 n  ]
在ARM的指令系统中,递减栈入栈操作的参数入栈顺序是从右到左依次入栈,而参数的出栈顺序则是从左到右的逆操作。对于递增栈,相应的操作则全部取反。
* u6 b6 k" H- B! D例如出栈指令:
5 J7 \: E8 M3 m% F/ C# L  V7 OLDMFD SP,{R4-R7}
: V5 T0 K& V$ a/ v实际的微指令操作为:
7 @0 `3 ]" |( I[SP]    =>  R4! m& s. v7 k. t$ t* I8 P
[SP+4]  =>  R5) o8 g9 b: ?9 V2 U5 Q' D: Q
[SP+8]  =>  R6
. F! ~9 r; A& d[SP+12] =>  R7+ ?9 X; V5 h) y9 j; h, ^& f! J" H4 s. x
上述的入栈和出栈指令其实仅仅对栈做了存取操作,并未真正改变SP指针的值。正常情况下,我们希望对栈操作后能自动修改栈指针SP的值,使用如下指令可以达到该目的。
5 [* g5 K; Q! S- }% q5 KSTMFD SP!,{R0-R3}4 p) E( J. a4 n0 G' G! M
对应的微指令操作为:' S! u( s' }$ _+ m$ O5 {
[SP-4]  <=  R3
2 |, ]( {2 ?* D( A[SP-8]  <=  R2
8 s, G3 S/ y, t% i; O[SP-12] <=  R1
' J  z+ B8 r+ ?7 X5 W[SP-16] <=  R0
6 H+ V0 I+ z7 m6 iSP      =  SP - 16
8 m4 @0 Z7 L; s/ E同样的:" k$ w% z1 R0 K1 @5 F( b! a
LDMFD SP!,{R4-R7}+ O( j" O6 `/ C+ \8 F( O
对应的微指令操作为:+ r: V7 Q6 \/ v4 {+ {" V' g
[SP]    =>  R4; V, K' G' A! Q6 I
[SP+4]  =>  R5
+ }4 k. x# P/ l. ]# Z' s8 Q[SP+8]  =>  R6
" I' l$ ?* v: Q[SP+12] =>  R7
* l8 P$ E; S) N% RSP      =  SP + 165 S. C$ k4 K6 M
2 D* R$ M" w# J; H6 `: a

" L0 r0 J) a. A/ A0 Z0 B5 i

该用户从未签到

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 11:20 , Processed in 0.171875 second(s), 27 queries , Gzip On.

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

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

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