这样程序的开头Start便被存入了显存变量valueOfStart中。
(11).hword{,}…
插入一个16-bit的数据队列。(与armasm中的DCW相同)
八.GNUARM汇编特殊字符和句型
代码行中的注释符号:‘@’
整行注释符号:‘#’
句子分离符号:‘;’
直接操作数前缀:‘#’或‘$’
第二部份GNU的编译器和调试工具
一.编译工具
1.编辑工具介绍
GNU
提供的编译工具包括汇编器as、C编译器gcc、C++编译器g++、连接器ld和二补码转换工具objcopy。基于ARM平台的工具分别为arm-
linux-as、arm-linux-gcc、arm-linux-g++、arm-linux-ld和arm-linux-
objcopy。GNU的编译器功能十分强悍,共有上百个操作选项,这也是这类工具让初学者呕吐的诱因。不过,实际开发中只须要用到有限的几个虚拟主机 linux,大部份可
以采用缺省选项。GNU工具的开发流程如下:编撰C、C++语言或汇编源程序,用gcc或g++生成目标文件,编撰联接脚本文件,用联接器生成最终目标文
件(elf格式),用二补码转换工具生成可下载的二补码代码。
(1)编撰C、C++语言或汇编源程序
一般汇编源程序用于系统最基本的初始化,如初始化堆栈表针、设置页表、操作ARM的协处理器等。初始化完成后就可以跳转到C代码执行。须要注意的
是,GNU的汇编器遵照AT&T的汇编句型,读者可以从GNU的站点()上下载有关规范。汇编程序的缺省入口是
start标号,用户也可以在联接脚本文件中用ENTRY标志指明其它入口点(见下文关于联接脚本的说明)。
(2)用gcc或g++生成目标文件
倘若应用程序包括多个文件,就须要进行分别编译,最后用联接器联接上去。如笔者的引导程序包括3个文件:init.s(汇编代码、初始化硬件)xmrecever.c(通讯模块gnu汇编,采用Xmode合同)和flash.c(Flash擦写模块)。
分别用如下命令生成目标文件:arm-linux-gcc-c-O2-oinit.oinit.s
arm-linux-gcc-c-O2-oxmrecever.oxmrecever.c
arm-linux-gcc-c-O2-oflash.oflash.c
其中-c命令表示只生成目标代码,不进行联接;-o命令指明目标文件的名称;-O2表示采用二级优化,采用优化后可使生成的代码更短,运行速率更快。假如项目包含好多文件gnu汇编,则须要编撰makefile文件。关于makefile的内容,请感兴趣的读者参考相关资料。
(3)编撰联接脚本文件
gcc
等编译器外置有缺省的联接脚本。倘若采用缺省脚本,则生成的目标代码须要操作系统能够加载运行。为了能在嵌入式系统上直接运行,须要编撰自己的联接脚本文
件。编撰联接脚本,首先要对目标文件的格式有一定了解。GNU编译器生成的目标文件缺省为elf格式。elf文件由若干段(section)组成,如不特
殊指明,由C源程序生成的目标代码中包含如下段:.text(正文段)包含程序的指令代码;.data(数据段)包含固定的数据,如常量、字符
串;.bss(未初始化数据段)包含未初始化的变量、数组等。C++源程序生成的目标代码中还包括.fini(析构函数代码)和.
init(构造函数代码)等。联接器的任务就是将多个目标文件的.text、.data和.bss等段联接在一起,而联接脚本文件是告诉联接器从哪些地址
开始放置这种段。诸如联接文件link.lds为:
ENTRY(begin)
SECTION
{
.=0x30000000;
.text:{*(.text)}
.data:{*(.data)}
.bss:{*(.bss)}
}
其中,ENTRY(begin)指明程序的入口点为begin标号;.=0x00300000指明目标代码的起始地址为0x30000000,这一段地址为
MX1的片内RAM;.text:{*(.text)}表示从0x30000000开始放置所有目标文件的代码段,此后的.data:{*
(.data)}表示数据段从代码段的末尾开始,再后是.bss段。
(4)用联接器生成最终目标文件
有了联接脚本文件,如下命令可生成最终的目标文件:
arm-linux-ld–nostadlib–obootstrap.elf-Tlink.ldsinit.o
xmrecever.oflash.o
其中,ostadlib表示不联接系统的运行库,而是直接从begin入口;-o指明目标文件的名称;-T指明采用的联接脚本文件(也可以使用-Ttext
address,address表示执行区地址);最后是须要联接的目标文件列表。
(5)生成二补码代码
联接生成的elf文件还不能直接下载执行,通过objcopy工具可生成最终的二补码文件:
arm-linux-objcopy–Obinarybootstrap.elfbootstrap.bin
其中-Obinary指定生成为二补码格式文件。Objcopy还可以生成S格式的文件,只需将参数换成-O
srec。还可以使用-S选项,移除所有的符号信息及重定位信息。假如想将生成的目标代码反汇编,还可以用objdump工具:
arm-linux-objdump-Dbootstrap.elf
至此,所生成的目标文件就可以直接写入Flash中运行了。
2.Makefile实例
example:head.smain.c
arm-linux-gcc-c-ohead.ohead.sarm-linux-gcc-c-omain.omain.carm-linux-ld-Tlink.ldshead.oain.o-o
example.elfarm-linux-objcopy-Obinary-Sexample_tmp.o
examplearm-linux-objdump-D-bbinary-marmexample
>ttt.s
二.调试工具
下的GNU调试工具主要是gdb、gdbserver和kgdb。其中gdb和gdbserver可完成对目标板上Linux下应用程序的远程调试。
gdbserver是一个很小的应用程序,运行于目标板上,可监控被调试进程的运行,并通过并口与上位机上的gdb通讯。开发者可以通过上位机的gdb输
入命令,控制目标板上进程的运行,查看显存和寄存器的内容。gdb5.1.1之后的版本加入了对ARM处理器的支持,在初始化时加入-
target==arm参数可直接生成基于ARM平台的gdbserver。gdb工具可以从ftp:
///pub/gnu/gdb/上下载。
对于Linux内核的调试,可以采用kgdb工具,同样须要通过并口与上位机上的gdb通讯,对目标板的Linux内核进行调试。可以从上了解具体的使用技巧。
参考资料:
1.RichardBlum,ProfessionalAssemblyLanguage
2.GNUARM
汇编快速入门,
3.ARMGNU
汇编伪指令简介,
4.
GNU汇编使用经验linux命令chm,
5.
GNU的编译器和开发工具,
6.
用GNU工具开发基于ARM的嵌入式系统,@126/blog/static/328975982696/
7.
objcopy命令介绍,