新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > GNU ARM匯編--(二)匯編編譯鏈接與運行

        GNU ARM匯編--(二)匯編編譯鏈接與運行

        作者: 時間:2016-11-26 來源:網絡 收藏
        GNU的匯編器是GNU Tools的一部分,可以用來ARM的匯編語言源代碼編譯為二進制文件.關于GNU匯編器的介紹可以搜索《GNU Assembler Manual》.這里我們只是做一個簡短的介紹,對GNU匯編器有一個大概的認識,同時通過兩個例子了解一下GNU ARM匯編.

        給出一個模板文件:

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

        [cpp]view plaincopy
        1. .text;Executablecodefollows
        2. _start:.global_start;"_start"isrequiredbythelinker
        3. .globalmain;"main"isourmainprogram
        4. bmain;Startrunningthemainprogram
        5. main:;Entrytothefunction"main"
        6. ;Insertyourcodehere
        7. movpc,lr;Returntothecaller
        8. .end
        匯編器的使用:

        一種匯編器是arm-elf-as,一種是arm-linux-as之類的,這兩種匯編器是有細微區別.但是一般做開發,半導體廠商都會提供特定的編譯器,用那個編譯器應該是沒錯的,而且優化效果應該是最優的,畢竟是芯片公司提供的嘛.他們對體系架構最了解,很清楚的知道怎么去優化.而我們一般的開發者也可以了解處理器的體系架構和嵌入式系統的系統的特征來對匯編代碼和c代碼做優化.

        編譯過程:

        arm-elf-as -marm7tdmi --gdwarf2 -o filename.o filename.s

        -marm7tdmi是指定CPU,arm7tdmi是屬于ARMv4T的,一般來說同是ARMv4T應該是兼容的.

        --gdwarf2是表示包含debug信息.

        鏈接過程:

        arm-elf-ld -o filename.elf filename.o

        和UNIX系統編程一樣,我們可以根據上面的步驟寫makefile,然后make一下.

        具體ARM的指令集,偽指令就不寫了,資料很多.

        下面舉兩個ARM匯編的實例,一個是裸機下的蜂鳴器(簡單的控制GPIO而已,比流水燈還簡單),一個是ARM linux下的"hello world"(利用系統調用來實現的).

        蜂鳴器的例子如下:

        beep.lds beep.S Makefile start.S

        start.S:

        [cpp]view plaincopy
        1. .text
        2. .global_start
        3. _start:
        4. ldrr3,=0x53000000@WATCHDOG寄存器地址
        5. movr4,#0x0
        6. strr4,[r3]@寫入0,禁止WATCHDOG,否則CPU會不斷重啟
        7. ldrsp,=1024*2@設置堆棧,注意:不能大于4k,因為現在可用的內存只有4K
        8. @nandflash中的代碼在復位后會移到內部ram中,此ram只有4K
        9. bl_main@跳轉到main函數
        10. halt_loop:
        11. bhalt_loop

        beep.S

        [cpp]view plaincopy
        1. .equGPBCON,0x56000010
        2. .equGPBDAT,0x56000014
        3. .global_main
        4. _main:
        5. ldrr0,=GPBCON
        6. ldrr1,=0x1
        7. strr1,[r0]
        8. loop:
        9. ldrr2,=GPBDAT
        10. ldrr1,=0x1
        11. strr1,[r2]
        12. bldelay
        13. ldrr2,=GPBDAT
        14. ldrr1,=0x0
        15. strr1,[r2]
        16. bldelay
        17. bloop
        18. delay:
        19. ldrr3,=0x4ffffff
        20. delay1:
        21. subr3,r3,#1
        22. cmpr3,#0x0
        23. bnedelay1
        24. movpc,lr
        25. .end

        beep.lds
        [cpp]view plaincopy
        1. OUTPUT_FORMAT("elf32-littlearm","elf32-littlearm","elf32-littlearm")
        2. OUTPUT_ARCH(arm)
        3. ENTRY(_start)
        4. SECTIONS{
        5. .=0x33000000;
        6. .text:{
        7. *(.text)
        8. *(.rodata)
        9. }
        10. .dataALIGN(4):{
        11. *(.data)
        12. }
        13. .bssALIGN(4):{
        14. *(.bss)
        15. }
        16. }

        makefile:


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 筠连县| 建平县| 绥德县| 探索| 铅山县| 庆城县| 精河县| 四平市| 丹东市| 新竹市| 大石桥市| 北宁市| 汉源县| 遂昌县| 南陵县| 凯里市| 鸡西市| 彝良县| 双辽市| 阳东县| 耿马| 普兰店市| 天气| 江西省| 保靖县| 仁怀市| 丰宁| 鲜城| 绍兴县| 乐安县| 信宜市| 泽库县| 邢台市| 涿鹿县| 乌兰县| 德钦县| 奉化市| 白山市| 色达县| 洪雅县| 瓦房店市|