ARM指令中STM和LDM的理解誤區(qū)
注:前面4種用于數(shù)據(jù)塊的傳輸,后面4種用于堆棧操作
本文引用地址:http://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ù)入棧時(shí)的指令為STMFD,那么數(shù)據(jù)出棧時(shí)的指令對(duì)應(yīng)的為L(zhǎng)DMFD,而不是LDMFA。
那么STMFD SP!,{R3,R2,R1}執(zhí)行后的堆棧順序是不是剛好和上面的堆棧順序相反,實(shí)際情況時(shí)這兩個(gè)指令執(zhí)行后的堆棧數(shù)據(jù)順序一樣,因?yàn)锳RM編譯器會(huì)自動(dòng)將STMFD SP!,{R3,R2,R1}轉(zhuǎn)換為STMFD SP!,{R0-R3}指令,也就是說,ARM編譯器默認(rèn)高寄存器優(yōu)先存入堆棧。即便你在指令STMFD SP!,{R3,R2,R1}中刻意“安排”了寄存器入棧順序,而在編譯時(shí)編譯器又重新做了處理,打亂了你期望的數(shù)據(jù)入棧順序。
評(píng)論