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

ARM的栈与栈指令

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
一、定义:栈(Stack)是限定仅在一端进行插入或删除操作的线性表。
$ D. u7 i% f+ b8 [% X2 L& |因此,对栈来说,可以进行插入或删除操作的一端端称为栈顶(top),相应地,另一端称为栈底(bottom)。不含元素的空表称为空栈。由于堆栈只允许在一端进行操作,因而按照后进先出(LIFO-Last In First Out)的原理运作。从栈顶的定义来看,栈顶的位置是可变的。空栈时,栈顶和栈底重合;满栈时,栈顶离栈底最远。ARM为堆栈提供了硬件支持,它使用一个专门的寄存器(堆栈指针)指向堆栈的栈顶。而且7种模式都有各自独立的堆栈指针,也就是有各自独立的堆栈空间。* g6 k2 w9 Q/ @# a0 w8 Y
二、如何描述一个栈
' S1 N8 }0 ]0 j# n准确描述一个栈的特点需要两个参数
6 j1 W5 U& {. \2 Q" M& S- z栈地址的增长方向:ARM将向高地址增长(也叫做向上增长)的栈称为递增栈(ascendant Stack),将向低地址增长(也叫做向下增长)的栈称为递减栈(descendantStack)* i, h% v! l+ ~% T0 o  {2 N- F' A9 Y
栈指针的指向位置:ARM将栈指针指向栈顶元素位置的栈称为满栈(Full Stack),讲栈指针指向即将入栈的元素位置的栈称为空栈(Empty Stack)
% r/ {% Z/ Z0 ]根据栈地址增长方向雨栈指针指向位置的不同,自然可以将栈分为四类:
: d: u. l" `. q# w
2 o6 M. d$ L3 {7 F% Y% S下图描述了四种不同类型的栈,其中虚线部分表示即将入栈的元素。
' w0 A- \; t( }0 w0 |7 |; r# d8 M
3 U8 n( o& w, \1 r
三、栈指令+ X+ V4 W. I1 R* ^; ~
栈的操作指令无非两种:入栈和出栈,由于ARM描述了四种不同类型的栈,因此对应的栈指令一共有8条。
- A) C0 z( y% G, r
STM:(STore Multiple data)表示存储数据,即入栈。+ E5 }4 p7 J0 ]( W0 ~; T# p; I
LDM:(LoaD Multiple data)表示加载数据,即出栈。
) u* y- t* ^- ?7 m" G一般情况下,可以将栈操作指令分解为两步微指令:数据存取和栈指针移动。这两步操作的先后顺序和栈指针的移动方式由栈的类型决定。7 Z8 e2 Q# @& ~

! G) N$ L4 l4 J" w2 w& u' mARM中存在一组缓冲区操作指令和栈指令是一一对应的,他们完成相同的功能。这些指令含义的区别来源于对存取操作的缓冲区指针地址增长方向,以及存取操作和缓冲区指针移动的先后顺序决定的。这个和前面描述的栈类型的分类原则十分相似。; C& V8 d! @& D* f. k- l5 V  ~

) a* E* r% b& Q' ^' ?; d$ U* {. G四、实例
7 V1 K+ Y7 _2 B1 f7 W) E8 _  B虽然ARM的栈类型和相关的操作指令比较繁琐,但是实际上最常用的还是和x86指令集相同的栈类型:栈向低地址方向增长,且栈指针指向栈顶元素的位置,即ARM的FD栈。因此最常见的ARM栈指令操作是STMFD和LDMFD。% ~$ R2 }. v! _# ]" a
例如入栈指令:( E4 }/ p: r5 f  Z7 ~7 s
STMFD SP,{R0-R3}5 }$ d% b, S6 o
实际的微指令操作为:2 [/ Q" l3 ^8 k3 D3 H" }! [
[SP-4]  <=  R3
, _! L1 ^5 w7 \[SP-8]  <=  R20 X# t" y# N# X+ {  M* s
[SP-12] <=  R1" M% ~- o* P, K4 n* j
[SP-16] <=  R06 A; f/ i+ s9 \! o: s) E
在ARM的指令系统中,递减栈入栈操作的参数入栈顺序是从右到左依次入栈,而参数的出栈顺序则是从左到右的逆操作。对于递增栈,相应的操作则全部取反。 8 ^$ e( f6 U! P" ]# D1 J! u( V
例如出栈指令:
$ l& w# y% Q/ v5 ^# d' PLDMFD SP,{R4-R7}  k0 H" L- E! l
实际的微指令操作为:
( Z& M) k* g% G9 b8 Q[SP]    =>  R4" O, H! q3 U$ R1 f& S& p. n1 }7 V
[SP+4]  =>  R5
1 U7 b4 ~* O+ a& W[SP+8]  =>  R6
3 I4 O- W9 b- m) t[SP+12] =>  R7. V1 Z; F/ s+ T) @, [: L
上述的入栈和出栈指令其实仅仅对栈做了存取操作,并未真正改变SP指针的值。正常情况下,我们希望对栈操作后能自动修改栈指针SP的值,使用如下指令可以达到该目的。
; b0 f  W" C1 z/ ySTMFD SP!,{R0-R3}7 \( V* D& Y: B; g
对应的微指令操作为:" T1 D. ]( R; W2 V+ L
[SP-4]  <=  R3  Y( N) G; A, ~% z% p2 e
[SP-8]  <=  R2
: v# Y+ n# n* C) N" I7 S! X; z[SP-12] <=  R1. Z) h/ R7 F5 C/ j0 D
[SP-16] <=  R0. T$ u6 s/ o( A9 d
SP      =  SP - 16
" Z" S8 M. q: X# @同样的:
8 I- u& Q: }2 l# |! `8 \; qLDMFD SP!,{R4-R7}4 f* u4 e' t- T+ c4 q
对应的微指令操作为:0 R/ v$ `9 Z/ k! n6 D- p) s1 w5 y+ K
[SP]    =>  R4; m9 n* q( ^7 k! L0 q/ B0 P4 v
[SP+4]  =>  R5# _! N+ }8 U- Q/ Q+ `. o9 P
[SP+8]  =>  R6
+ s7 k; V# |( X8 U" r[SP+12] =>  R72 e- Q, O% x. x. i. s
SP      =  SP + 16/ @* r  ^% x7 e. S% {2 }) a9 @% D

& c5 b4 A  |! z6 I: X. p+ t; G: J& x6 h4 E; m. h8 y4 u

该用户从未签到

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 12:52 , Processed in 0.156250 second(s), 26 queries , Gzip On.

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

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

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