以前困惑的就是stmfd 命令 对于操作数 是按照什么顺序压栈的
比如:stmfd sp!{r0-r5,lr} 进栈顺序是:
高地址(1方式)
lr
r5
r4
```````
r0
低地址
还是:
高地址(2方式)
r0
r1
```
r5
lr
低地址
现在通过下表,可以轻松的解决这个问题:
寻址方式 | 说明 | 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,这样这两个操作就可以成功配对