ARM的压栈与出栈

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

posted @ 2013-12-14 09:39  general001  阅读(1936)  评论(0)    收藏  举报