ARM指令中STM和LDM的理解誤區(qū)
注:前面4種用于數(shù)據(jù)塊的傳輸,后面4種用于堆棧操作
本文引用地址:http://m.butianyuan.cn/article/201611/320504.htm(1)IA
(2)IB
(3)DA
(4)DB
(5)FD
(6)FA
(7)ED
(8)EA
但是FD和FA僅用于只是目前操作的堆棧是何種模式(堆棧共有四種模式),F(xiàn)D指明目前的堆棧是滿遞減堆棧,
則數(shù)據(jù)入棧時的指令為STMFD,那么數(shù)據(jù)出棧時的指令對應(yīng)的為LDMFD,而不是LDMFA。
那么STMFD SP!,{R3,R2,R1}執(zhí)行后的堆棧順序是不是剛好和上面的堆棧順序相反,實際情況時這兩個指令執(zhí)行后的堆棧數(shù)據(jù)順序一樣,因為ARM編譯器會自動將STMFD SP!,{R3,R2,R1}轉(zhuǎn)換為STMFD SP!,{R0-R3}指令,也就是說,ARM編譯器默認高寄存器優(yōu)先存入堆棧。即便你在指令STMFD SP!,{R3,R2,R1}中刻意“安排”了寄存器入棧順序,而在編譯時編譯器又重新做了處理,打亂了你期望的數(shù)據(jù)入棧順序。
評論