GNU ARM匯編--(二)匯編編譯鏈接與運(yùn)行
給出一個(gè)模板文件:
本文引用地址:http://butianyuan.cn/article/201611/321729.htm- .text;Executablecodefollows
- _start:.global_start;"_start"isrequiredbythelinker
- .globalmain;"main"isourmainprogram
- bmain;Startrunningthemainprogram
- main:;Entrytothefunction"main"
- ;Insertyourcodehere
- movpc,lr;Returntothecaller
- .end
一種匯編器是arm-elf-as,一種是arm-linux-as之類的,這兩種匯編器是有細(xì)微區(qū)別.但是一般做開發(fā),半導(dǎo)體廠商都會(huì)提供特定的編譯器,用那個(gè)編譯器應(yīng)該是沒(méi)錯(cuò)的,而且優(yōu)化效果應(yīng)該是最優(yōu)的,畢竟是芯片公司提供的嘛.他們對(duì)體系架構(gòu)最了解,很清楚的知道怎么去優(yōu)化.而我們一般的開發(fā)者也可以了解處理器的體系架構(gòu)和嵌入式系統(tǒng)的系統(tǒng)的特征來(lái)對(duì)匯編代碼和c代碼做優(yōu)化.
編譯過(guò)程:
arm-elf-as -marm7tdmi --gdwarf2 -o filename.o filename.s
-marm7tdmi是指定CPU,arm7tdmi是屬于ARMv4T的,一般來(lái)說(shuō)同是ARMv4T應(yīng)該是兼容的.
--gdwarf2是表示包含debug信息.
鏈接過(guò)程:
arm-elf-ld -o filename.elf filename.o
和UNIX系統(tǒng)編程一樣,我們可以根據(jù)上面的步驟寫makefile,然后make一下.
具體ARM的指令集,偽指令就不寫了,資料很多.
下面舉兩個(gè)ARM匯編的實(shí)例,一個(gè)是裸機(jī)下的蜂鳴器(簡(jiǎn)單的控制GPIO而已,比流水燈還簡(jiǎn)單),一個(gè)是ARM linux下的"hello world"(利用系統(tǒng)調(diào)用來(lái)實(shí)現(xiàn)的).
蜂鳴器的例子如下:
beep.lds beep.S Makefile start.S
start.S:
- .text
- .global_start
- _start:
- ldrr3,=0x53000000@WATCHDOG寄存器地址
- movr4,#0x0
- strr4,[r3]@寫入0,禁止WATCHDOG,否則CPU會(huì)不斷重啟
- ldrsp,=1024*2@設(shè)置堆棧,注意:不能大于4k,因?yàn)楝F(xiàn)在可用的內(nèi)存只有4K
- @nandflash中的代碼在復(fù)位后會(huì)移到內(nèi)部ram中,此ram只有4K
- bl_main@跳轉(zhuǎn)到main函數(shù)
- halt_loop:
- bhalt_loop
beep.S
- .equGPBCON,0x56000010
- .equGPBDAT,0x56000014
- .global_main
- _main:
- ldrr0,=GPBCON
- ldrr1,=0x1
- strr1,[r0]
- loop:
- ldrr2,=GPBDAT
- ldrr1,=0x1
- strr1,[r2]
- bldelay
- ldrr2,=GPBDAT
- ldrr1,=0x0
- strr1,[r2]
- bldelay
- bloop
- delay:
- ldrr3,=0x4ffffff
- delay1:
- subr3,r3,#1
- cmpr3,#0x0
- bnedelay1
- movpc,lr
- .end
beep.lds
- OUTPUT_FORMAT("elf32-littlearm","elf32-littlearm","elf32-littlearm")
- OUTPUT_ARCH(arm)
- ENTRY(_start)
- SECTIONS{
- .=0x33000000;
- .text:{
- *(.text)
- *(.rodata)
- }
- .dataALIGN(4):{
- *(.data)
- }
- .bssALIGN(4):{
- *(.bss)
- }
- }
makefile:
評(píng)論