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

ARM的栈与栈指令

[复制链接]

该用户从未签到

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

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

该用户从未签到

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-10-13 04:38 , Processed in 0.125000 second(s), 26 queries , Gzip On.

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

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

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