您的位置 首页 嵌入式

GNU ARM汇编–(二)汇编编译链接与运转

GNU的汇编器是GNUTools的一部分,可以用来ARM的汇编语言源代码编译为二进制文件关于GNU汇编器的介绍可以搜索《GNUAssemblerManua

GNU的汇编器是GNU Tools的一部分,能够用来ARM的汇编语言源代码编译为二进制文件.关于GNU汇编器的介绍能够查找《GNU Assembler Manual》.这儿咱们仅仅做一个简略的介绍,对GNU汇编器有一个大约的知道,一起经过两个比如了解一下GNU ARM汇编.

给出一个模板文件:

[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:

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/258071.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部