新聞中心

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

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

        作者: 時間:2016-11-26 來源:網絡 收藏

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

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

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

        ea00000e轉換為二進制后:

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

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

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

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

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

        注意上面等式中的+8與流水線有關.

        B和BL的跳轉范圍是+-32MB,24bit的有符號數,也就是-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


        反匯編結果如下:

        [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

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

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


        上一頁 1 2 下一頁

        關鍵詞: ARM匯編匯編指

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 荣成市| 崇仁县| 山阳县| 鄄城县| 乌兰察布市| 灌阳县| 阳原县| 胶南市| 临夏县| 安阳县| 宁强县| 托克逊县| 金寨县| 潮安县| 定结县| 雅安市| 亚东县| 梓潼县| 祁阳县| 宜良县| 定陶县| 昌图县| 辛集市| 上林县| 双辽市| 江孜县| 东阿县| 福海县| 新化县| 健康| 英德市| 武清区| 将乐县| 民勤县| 龙游县| 高要市| 绥阳县| 弥渡县| 丹寨县| 安岳县| 资阳市|