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,这样这两个操作就可以成功配对:
能力决定舞台,业绩体现价值,财富回报才智!
不积跬步,无以至千里;不积小流,无以成江海!
千里之行,始于足下。改变现在,就是改变未来。改变未来,从现在开始。

浙公网安备 33010602011771号