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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > ARM匯編中B跳轉指令和LDR跳轉的區(qū)別

          ARM匯編中B跳轉指令和LDR跳轉的區(qū)別

          作者: 時間:2016-11-20 來源:網(wǎng)絡 收藏
          • B跳轉指令是代碼位置無關的,經(jīng)過匯編后會替換為當前PC值加(減)一個修正值,不管這條指令是在哪一個地址執(zhí)行,都能跳轉到指定的位置。
          • B只能在當前PC的32M范圍內跳轉,LDR只能在當前PC的4KB(0xfff范圍)跳轉。
          • LDR PC,=xxx指令將向PC直接裝載一個標號xxx的值,但標號經(jīng)過編譯后將被替換為一個與RO相對應的值,這樣無論指令在何處執(zhí)行都能跳轉到一個指定的位置。
          • 以AT91SAM9260 的啟動代碼片段為例,0x10000000為Flash基址,0x20000000為SDRAM基址:

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

          其中ENTRY為起點,也就是說這條代碼的偏移為0.設HandlerReset的偏移為offset。如果將這段程序按照RO=0x10000000編譯則:

          b HandlerReset <=> ADD PC , PC,#offset

          LDR PC,=HandlerReset <=> MOV PC , #(RO+offset)

          當系統(tǒng)復位時,b HandlerReset 將PC指向0地址處Flash鏡像代碼的位置;而LDR PC,=HandlerReset將PC指向Flash中的原始代碼位置,所以兩者都能正常執(zhí)行。

          但是,如果程序按照RO=0x20000000編譯,編譯后生成的代碼還是得燒寫到Flash中,即0x10000000地址,系統(tǒng)復位后從0地址執(zhí)行,b HandlerReset仍執(zhí)行Flash鏡像代碼,程序能正常執(zhí)行,而LDR PC,=HandlerReset將使PC指向0x20000000+offset,此地址位于SDRAM中,而此時代碼尚未復制,SDRAM中尚無代碼,程序不能運行。



          評論


          技術專區(qū)

          關閉
          看屁屁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); })();