<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

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

          給出一個模板文件:

          本文引用地址:http://www.ex-cimer.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之類的,這兩種匯編器是有細微區(qū)別.但是一般做開發(fā),半導體廠商都會提供特定的編譯器,用那個編譯器應該是沒錯的,而且優(yōu)化效果應該是最優(yōu)的,畢竟是芯片公司提供的嘛.他們對體系架構(gòu)最了解,很清楚的知道怎么去優(yōu)化.而我們一般的開發(fā)者也可以了解處理器的體系架構(gòu)和嵌入式系統(tǒng)的系統(tǒng)的特征來對匯編代碼和c代碼做優(yōu)化.

          編譯過程:

          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系統(tǒng)編程一樣,我們可以根據(jù)上面的步驟寫makefile,然后make一下.

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

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

          蜂鳴器的例子如下:

          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@設(shè)置堆棧,注意:不能大于4k,因為現(xiàn)在可用的內(nèi)存只有4K
          8. @nandflash中的代碼在復位后會移到內(nèi)部ram中,此ram只有4K
          9. bl_main@跳轉(zhuǎn)到main函數(shù)
          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 下一頁

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();