新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > ARM指令中STM和LDM的理解誤區(qū)

ARM指令中STM和LDM的理解誤區(qū)

作者: 時間:2016-11-23 來源:網(wǎng)絡(luò) 收藏
STMLDM的主要用途是現(xiàn)場保護、數(shù)據(jù)復(fù)制、參數(shù)傳遞等,其模式有8種,如下:

注:前面4種用于數(shù)據(jù)塊的傳輸,后面4種用于堆棧操作

本文引用地址:http://m.butianyuan.cn/article/201611/320504.htm

(1)IA 每次傳送后地址加4

(2)IB 每次傳送前地址加4

(3)DA 每次傳送后地址減4

(4)DB 每次傳送前地址減4

(5)FD 滿遞減堆棧

(6)FA 滿遞增堆棧

(7)ED 空遞減堆棧

(8)EA 空遞增堆棧

下面的講述對于空遞減堆棧和空遞增堆棧同樣適用.

在堆棧操作時,經(jīng)常錯誤以為使用STMFD滿遞減將寄存器壓入堆棧后,在彈出數(shù)據(jù)的時候應(yīng)該使用LDMFA。

但是FD和FA僅用于只是目前操作的堆棧是何種模式(堆棧共有四種模式),F(xiàn)D指明目前的堆棧是滿遞減堆棧,

則數(shù)據(jù)入棧時的指令為STMFD,那么數(shù)據(jù)出棧時的指令對應(yīng)的為LDMFD,而不是LDMFA。

我們可以這樣認為STMFD等價于STMDB,LDMFD等價于STMIA

那么,數(shù)據(jù)傳輸?shù)捻樞蚝蛿?shù)據(jù)入棧的順序又是如何呢

先來看STMFD SP!,{R1-R3} 執(zhí)行的結(jié)果圖(操作之后SP指向SP)

SP------->

|R3|

|R2|

SP------>|R1|

那么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ù)入棧順序。

同理STMDB R0!,{R1-R3}和STMDB R0!,{R3,R2,R1}指令執(zhí)行后數(shù)據(jù)在堆棧中的順序完全一致。

STMFD SP!,{R1-R3}指令對應(yīng)的出棧指令是LDMFD SP!,{R1-R3}(R1,R2,R3的順序任意)




關(guān)鍵詞: ARM指令STMLDM理解誤

評論


技術(shù)專區(qū)

關(guān)閉