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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應用 > GNU ARM匯編--(十二)arm匯編指令的B真的那么簡單嗎?

          GNU ARM匯編--(十二)arm匯編指令的B真的那么簡單嗎?

          作者: 時間:2016-11-26 來源:網(wǎng)絡 收藏

          本文引用地址:http://www.ex-cimer.com/article/201611/321719.htm

          對照匯編和反匯編的結(jié)果,一切正常.下面我們來看看ea00000e是如何表達b10000040 的?

          31 28 27 26 25 24 23 0
          cond 1 0 1 L signed_immed_24

          ea00000e轉(zhuǎn)換為二進制后:

          31 28 27 26 25 24 23 0
          1110 1 0 1 0 0x00000e

          cond是1110,即是條件執(zhí)行的ALL,L為0表示指令是B,不是BL.signed_immed_24值為0x00000e.

          signed表示有符號數(shù).所以0x00000e就是+15,按照上圖的規(guī)則:

          0x10000000+14<<2+8 = 0x10000040

          這里的0x10000000等地址都是VMA(虛擬內(nèi)存地址),而B跳轉(zhuǎn)的地址是和PC相關(guān)的,所以這部分代碼是與位置無關(guān)的.

          注意上面等式中的+8與流水線有關(guān).

          B和BL的跳轉(zhuǎn)范圍是+-32MB,24bit的有符號數(shù),也就是-2^23--2^23,即-8MB--8MB,因為有那個<<2,所以就是+-32MB了.

          可以再看一個例子:

          代碼如下:

          [cpp]view plaincopy
          1. ledloop:
          2. ldrr1,=0x1c0
          3. strr1,[r2]
          4. bldelay
          5. ldrr1,=0x1a0
          6. strr1,[r2]
          7. bldelay
          8. ldrr1,=0x160
          9. strr1,[r2]
          10. bldelay
          11. ldrr1,=0x0e0
          12. strr1,[r2]
          13. bldelay
          14. bledloop


          反匯編結(jié)果如下:

          [cpp]view plaincopy
          1. 100002f0:
          2. 100002f0:e3a01d07movr1,#448;0x1c0
          3. 100002f4:e5821000strr1,[r2]
          4. 100002f8:ebffffadbl100001b4
          5. 100002fc:e3a01e1amovr1,#416;0x1a0
          6. 10000300:e5821000strr1,[r2]
          7. 10000304:ebffffaabl100001b4
          8. 10000308:e3a01e16movr1,#352;0x160
          9. 1000030c:e5821000strr1,[r2]
          10. 10000310:ebffffa7bl100001b4
          11. 10000314:e3a010e0movr1,#224;0xe0
          12. 10000318:e5821000strr1,[r2]
          13. 1000031c:ebffffa4bl100001b4
          14. 10000320:eafffff2b100002f0


          同樣的:0x10000320+8+(-14)<<2 = 0x1000002f0

          結(jié)合官方文檔和兩個實例,才能真正明白B指令的一些細節(jié).而不是一些中文書上所說的正確的但是表面的內(nèi)容.

          這么深入的分析指令B并不太麻煩,但是arm匯編有很多指令,不可能一一去分析.這里分析指令B,只是因為跳轉(zhuǎn)指令在bootloader中很重要.而這里給出了一個方法,如果對LDR這種指令不清楚的話,可以用同樣的方法來分析.


          上一頁 1 2 下一頁

          關(guān)鍵詞: ARM匯編匯編指

          評論


          技術(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); })();