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