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

          新聞中心

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

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

          作者: 時(shí)間:2016-11-23 來(lái)源:網(wǎng)絡(luò) 收藏
          STMLDM的主要用途是現(xiàn)場(chǎng)保護(hù)、數(shù)據(jù)復(fù)制、參數(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 滿(mǎn)遞減堆棧

          (6)FA 滿(mǎn)遞增堆棧

          (7)ED 空遞減堆棧

          (8)EA 空遞增堆棧

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

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

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

          則數(shù)據(jù)入棧時(shí)的指令為STMFD,那么數(shù)據(jù)出棧時(shí)的指令對(duì)應(yīng)的為L(zhǎng)DMFD,而不是LDMFA。

          我們可以這樣認(rèn)為STMFD等價(jià)于STMDB,LDMFD等價(jià)于STMIA

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

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

          SP------->

          |R3|

          |R2|

          SP------>|R1|

          那么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}指令,也就是說(shuō),ARM編譯器默認(rèn)高寄存器優(yōu)先存入堆棧。即便你在指令STMFD SP!,{R3,R2,R1}中刻意“安排”了寄存器入棧順序,而在編譯時(shí)編譯器又重新做了處理,打亂了你期望的數(shù)據(jù)入棧順序。

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

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




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

          評(píng)論


          技術(shù)專(zhuān)區(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); })();