<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          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ù)復制、參數(shù)傳遞等,其模式有8種,如下:

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

          本文引用地址:http://www.ex-cimer.com/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)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();