新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM下書寫位置無關的代碼

        ARM下書寫位置無關的代碼

        作者: 時間:2016-11-27 來源:網絡 收藏
        位置無關代碼,即該段代碼無論放在內存的哪個地址,都能正確運行。究其原因,是因為代碼里
        沒有使用絕對地址,都是相對地址。

        位置無關的寫法:

        (1) B指令

        B指令接受一個相對地址,因此在匯編里用B跳轉到一個標號時,實際編譯的結果是一個相對跳轉。
        相對地址有個范圍限制,即目標不能太遠,一般目標放在同一個文件里是肯定可以的。
        _start:
        b_reset
        _reset:
        ...

        (2) BL

        BL用于調用函數,也是一個相對跳轉

        (3) ADR

        獲取標號的地址,在編譯時會使用PC+偏移的方式得到該位置的地址。例如,當TEXT_BASE是0時
        SMRDATA可能被放在0x100的位置,當TEXT_BASE為0x30000000時放在0x30000100的位置。使用ADR
        總能獲取正確的位置,與程序的加載地址無關。
        ADR R0, SMRDATA
        SMRDATA:
        .word0x22111120
        .word0x00002F50
        .word0x00000700
        (相應的, LDR Rn, =LABEL是位置相關的)

        (4) LDR

        當加標號時,LDR可以用于偽指令,也可以真指令。
        真指令: (標號前不加=號,表示取標號處的值)
        LDR R0,SDRDATA
        實際被編譯為LDR R0, [PC, #NN],其中NN是目標的相對距離

        偽指令: (標號前加=號,取標號的地址)
        LDR R0, = SDRDATA
        實際編譯的時候的時候,會在某位置存處SDRDATA的值,然后用一個LDR取出來。
        顯然,用LDR時,加不加=號有很大區別。
        無=號:取該標號處的值,位置無關
        有=號:取該標號的地址,位置相關

        舉例分析

        例1:中斷向量跳轉

        _start:
        breset
        ldrpc, _undefined_instruction
        ldrpc, _software_interrupt
        ldrpc, _prefetch_abort
        ldrpc, _data_abort
        ldrpc, _not_used
        ldrpc, _irq
        ldrpc, _fiq

        _undefined_instruction:.word undefined_instruction
        _software_interrupt:.word software_interrupt
        _prefetch_abort:.word prefetch_abort
        _data_abort:.word data_abort
        _not_used:.word not_used
        _irq:.word irq
        _fiq:.word fiq
        其中,
        ldr pc, _irq,由于沒加=號,表示取值_irq處的值放在pc里 (位置無關)
        _irq:.word irq ,表示_irq存放的值是irq的絕對地址(位置有關)


        關鍵詞: ARM位置無關代

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 康乐县| 泉州市| 万山特区| 全南县| 长沙县| 准格尔旗| 峨山| 佛冈县| 棋牌| 惠东县| 郁南县| 昔阳县| 瑞昌市| 神农架林区| 获嘉县| 襄樊市| 永春县| 兰溪市| 婺源县| 奉贤区| 太湖县| 平顺县| 大宁县| 泾川县| 酉阳| 炎陵县| 漠河县| 东乌| 衡阳市| 休宁县| 新宾| 潼南县| 红桥区| 枣阳市| 陕西省| 京山县| 金昌市| 外汇| 孟津县| 黄石市| 阳东县|