ARM的入棧出棧具體的操作詳解
我看的資料具體也就說(shuō)到這里了。
本文引用地址:http://m.butianyuan.cn/article/201611/316907.htm看下面的例子:
STMFD SP!, {R0-R3, R12, LR}
。。。。。。
LDMFD SP!, {R0-R3, R12, PC}^
STMFD之后,SP就指向LR了,LDMFD 就把LR 出棧給了R0了,若這么理解的話肯定不對(duì)了。肯定進(jìn)棧和出棧的順序是不一樣的,雖然表達(dá)方式上可能為了直觀都是從 低到高的寄存器。
以前困惑的就是STMFD 命令 對(duì)于操作數(shù) 是按照什么順序壓棧的
比如:STMFD sp!{R0-R5,LR} 進(jìn)棧順序是:
高地址(1方式)
LR
R5
R4
```````
R0 <-sp
低地址
還是:
高地址(2方式)
R0
R1
```
R5
LR <-sp
低地址
現(xiàn)在通過(guò)下表,可以輕松的解決這個(gè)問(wèn)題:
尋址方式 | 說(shuō)明 | pop | =LDM | push | =STM |
FA | 遞增滿 | LDMFA | LDMDA | STMFA | STMIB |
FD | 遞減滿 | LDMFD | LDMIA | STMFD | STMDB |
EA | 遞增空 | LDMEA | LDMDB | STMEA | STMIA |
ED | 遞減空 | LDMED | LDMIB | STMED | STMDA |
按照?qǐng)D表,可知 STMFD對(duì)應(yīng)的是STMDB,根據(jù)arm指令手冊(cè),可知STMDB入棧順序是(1方式)
而LDMFD對(duì)應(yīng)的是LDMIA,這樣這兩個(gè)操作就可以成功配對(duì)
評(píng)論