GNU的汇编器是GNU Tools的一部分,能够用来ARM的汇编语言源代码编译为二进制文件.关于GNU汇编器的介绍能够查找《GNU Assembler Manual》.这儿咱们仅仅做一个简略的介绍,对GNU汇编器有一个大约的知道,一起经过两个比如了解一下GNU ARM汇编.
给出一个模板文件:
- .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之类的,这两种汇编器是有纤细差异.可是一般做开发,半导体厂商都会供给特定的编译器,用那个编译器应该是没错的,并且优化作用应该是最优的,毕竟是芯片公司供给的嘛.他们对体系架构最了解,很清楚的知道怎样去优化.而咱们一般的开发者也能够了解处理器的体系架构和嵌入式体系的体系的特征来对汇编代码和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:
- .text
- .global_start
- _start:
- ldrr3,=0x53000000@WATCHDOG寄存器地址
- movr4,#0x0
- strr4,[r3]@写入0,制止WATCHDOG,不然CPU会不断重启
- ldrsp,=1024*2@设置仓库,留意:不能大于4k,由于现在可用的内存只要4K
- @nandflash中的代码在复位后会移到内部ram中,此ram只要4K
- bl_main@跳转到main函数
- 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: