新闻中心

EEPW首页>嵌入式系统>设计应用> ARM的入栈出栈具体的操作详解

ARM的入栈出栈具体的操作详解

作者: 时间:2016-11-11 来源:网络 收藏
ARM用ADS编译的话,用的是FD 满减 栈方式。顺便说下满减 FD方式,入栈是先移动SP,再存数据;出栈是先存数据,再移SP。

我看的资料具体也就说到这里了。

本文引用地址://m.amcfsurvey.com/article/201611/316907.htm

看下面的例子:

STMFD SP!, {R0-R3, R12, LR}

。。。。。。


LDMFD SP!, {R0-R3, R12, PC}^

STMFD之后,SP就指向LR了,LDMFD 就把LR 出栈给了R0了,若这么理解的话肯定不对了。肯定进栈和出栈的顺序是不一样的,虽然表达方式上可能为了直观都是从 低到高的寄存器。

以前困惑的就是STMFD 命令 对于操作数 是按照什么顺序压栈的

比如:STMFD sp!{R0-R5,LR} 进栈顺序是:

高地址(1方式)

LR

R5

R4

```````

R0 <-sp

低地址

还是:

高地址(2方式)

R0

R1

```

R5

LR <-sp

低地址

现在通过下表,可以轻松的解决这个问题:

寻址方式
说明
pop
=LDM
push
=STM
FA
递增满
LDMFA
LDMDA
STMFA
STMIB
FD
递减满
LDMFD
LDMIA
STMFD
STMDB
EA
递增空
LDMEA
LDMDB
STMEA
STMIA
ED
递减空
LDMED
LDMIB
STMED
STMDA

按照图表,可知 STMFD对应的是STMDB,根据arm指令手册,可知STMDB入栈顺序是(1方式)

而LDMFD对应的是LDMIA,这样这两个操作就可以成功配对



关键词:ARM入栈出

评论


技术专区

关闭