国产无码免费,人妻口爆,国产V在线,99中文精品7,国产成人无码AA精品一,制度丝袜诱惑av,久久99免费麻辣视频,蜜臀久久99精品久久久久久酒店
        訂閱
        糾錯
        加入自媒體

        從0學ARM——什么是位置無關碼?

        2021-01-13 16:01
        一口Linux
        關注

        二、怎么實現位置無關碼?

        1. 什么是《編譯地址》?什么是《運行地址》?

        「編譯地址:」

        32位的處理器,它的每一條指令是4個字節,以4個字節存儲順序,進行順序執行,CPU是順序執行的,只要沒發生什么跳轉,它會順序進行執行, 編譯器會對每一條指令分配一個編譯地址,這是編譯器分配的,在編譯過程中分配的地址,我們稱之為編譯地址。

        「運行地址:」

        是指程序指令真正運行的地址,是由用戶指定的,用戶將運行地址燒錄到哪里,哪里就是運行的地址。比如有一個指令的編譯地址是0x40008000,實際運行的地址是0x40008000,如果用戶將指令燒到0x60000000上,那么這條指令的運行地址就是0x60000000。

        當編譯地址和運行地址不同的時候會出現什么結果?結果是不能跳轉,編譯后會產生跳轉地址,如果實際地址和編譯后產生的地址不相等,那么就不能跳轉。

        「C語言編譯地址:」

        都希望把編譯地址和實際運行地址放在一起的,但是匯編代碼因為不需要做C語言到匯編的轉換,可以直接的去寫地址,所以直接寫的就是他的運行地址,這就是為什么任何bootloader剛開始會有一段匯編代碼,因為起始代碼編譯地址和實際地址不相等,這段代碼和匯編無關,跳轉用的運行地址。

        2. 舉例

        實現位置無關碼主要考慮以下兩個方面:

        1. 位置無關的函數跳轉
        2. 位置無關的常量訪問

        下面我們通過兩個例子詳細講解。

        代碼

        編譯代碼使用的連接文件「map.lds」如下:

        OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
        OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")
        OUTPUT_ARCH(arm)
        ENTRY(_start)
        SECTIONS

        . = 0x40008000;
        . = ALIGN(4);
        .text      :

         gcd.o(.text)
         *(.text)

        . = ALIGN(4);
           .rodata :
        { *(.rodata) }
           . = ALIGN(4);
           .data :
        { *(.data) }
           . = ALIGN(4);
           .bss :
            { *(.bss) }

        如文件map.lds所示:「0x40008000」就是鏈接地址,

        其他源文件如下:「gcd.s」

        .text
        .global _start
        _start:
         ldr  sp,=0x70000000         get stack top pointer
         bl func
         ldr pc,=func
         b  main
        func:
        mv pc,lr

        「main.c」


        * main.c

        *  Created on: 2020-12-12
        *      Author: 一口Linux

        int aaaa=0;
        int main(void)

        aaaa = 0x11;
        while(1);
           return 0;

        「Makefile」

        TARGET=gcd
        TARGETC=main
        all:
        arm-none-linux-gnueabi-gcc -O1 -g -c -o $(TARGETC).o  $(TARGETC).c
        arm-none-linux-gnueabi-gcc -O1 -g -c -o $(TARGET).o $(TARGET).s
        arm-none-linux-gnueabi-gcc -O1 -g -S -o $(TARGETC).s  $(TARGETC).c
        arm-none-linux-gnueabi-ld $(TARGETC).o $(TARGET).o -Tmap.lds  -o  $(TARGET).elf
        arm-none-linux-gnueabi-objcopy -O binary -S $(TARGET).elf $(TARGET).bin
        arm-none-linux-gnueabi-objdump -D $(TARGET).elf > $(TARGET).dis
        clean:
        rm -rf *.o *.elf *.dis *.bin
        反匯編文件「gcd.dis」

        如上圖所示:

        _start對應的鏈接地址是0x400080009行 bl func對應的指令10行 ldr pc,=pc對應的指令func的鏈接地址0x40008010全局變量aaaa對應的內存位于bss段0x4000802c19行 aaaa = 0x11 賦值語句對應的機器碼

        <上一頁  1  2  3  下一頁>  
        聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權或其他問題,請聯系舉報。

        發表評論

        0條評論,0人參與

        請輸入評論內容...

        請輸入評論/評論長度6~500個字

        您提交的評論過于頻繁,請輸入驗證碼繼續

        暫無評論

        暫無評論

          人工智能 獵頭職位 更多
          掃碼關注公眾號
          OFweek人工智能網
          獲取更多精彩內容
          文章糾錯
          x
          *文字標題:
          *糾錯內容:
          聯系郵箱:
          *驗 證 碼:

          粵公網安備 44030502002758號

          主站蜘蛛池模板: 精品久久久久中文字幕无码油 | 亚洲丝袜熟女| 深泽县| 狼友视区| 沙湾县| 日韩AV一区二区三区四区| 玩弄丰满少妇一二三区| 狼友福利在线| 国产超碰人人| 午夜剧场黄色| 一本色道久久综合无码人妻| 欧美阿V| 欧美色女人| 国产中文字幕制服| 五月婷婷成人| 桓台县| 熟女福利导航| 麻豆A∨在线| 欧美色综合| 久久精品亚洲| 肥城市| av色天堂| 永济市| 1024你懂的日韩人妻学生| 镇安县| 精品综合视频精品| 久久草网站| 九九国产在线| 女生洗鸡鸡喷尿的视频无马赛克?舒坦直叫的骚货视频?亚洲着九九九视频影院 | 黑人巨大超大另类videos| 婷婷综合在线| 亚洲欧洲av| 启东市| 国产va| 黄浦区| 国产av日韩av| 冀州市| 精品人妻伦九区久久AAA片| 泗洪县| 91嫩草在线| 91丨人妻丨国产丨丝袜|