微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM的入栈出栈具体的操作详解

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

时间:11-11 来源:互联网 点击:
ARM用ADS编译的话,用的是FD 满减 栈方式。顺便说下满减 FD方式,入栈是先移动SP,再存数据;出栈是先存数据,再移SP。

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

看下面的例子:

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,这样这两个操作就可以成功配对

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top