新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM匯編中B跳轉指令和LDR跳轉的區別

        ARM匯編中B跳轉指令和LDR跳轉的區別

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

        本文引用地址:http://www.104case.com/article/201611/318788.htm

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

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

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

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

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



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 常宁市| 泰安市| 凉城县| 宝清县| 清远市| 阿合奇县| 兰坪| 龙陵县| 新郑市| 绥阳县| 泗洪县| 宁国市| 钟祥市| 鹰潭市| 呼和浩特市| 玛纳斯县| 昌平区| 德令哈市| 榆林市| 马尔康县| 团风县| 道孚县| 沾化县| 永泰县| 石林| 芦山县| 农安县| 白玉县| 双辽市| 田东县| 调兵山市| 海淀区| 池州市| 年辖:市辖区| 河曲县| 桐城市| 垦利县| 长沙市| 宜都市| 神农架林区| 黄陵县|