ARM GNU 汇编伪指令简介,编译器和开发工具,用GNU工具开发基于ARM的嵌入式系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ARM GNU 汇编伪指令简介
1 ARM GNU 汇编伪指令简介
(1)abort
.abort 停止汇编
(2)align
.align absexpr1,absexpr2
以某种对齐方式,在未使用的存储区域填充值. 第一个值表示对齐方式,4, 8,16或
32. 第二个表达式值表示填充的值
(3)if...else...endif
.if
.else
.endif: 支持条件预编译
(4)include
.include "file": 包含指定的头文件, 可以把一个汇编常量定义放在头文件中
(5)comm
.comm symbol, length:
在bss段申请一段命名空间,该段空间的名称叫symbol, 长度为length. Ld连接器在连接会为它留出空间
(6)data
.data subsection: 说明接下来的定义归属于subsection数据段
(7)equ
.equ symbol, expression: 把某一个符号(symbol)定义成某一个值(expression).该指令并不分配空间
(8)global
.global symbol: 定义一个全局符号, 通常是为ld使用
(9)ascii
.ascii "string": 定义一个字符串并为之分配空间
(10)byte
.byte expressions: 定义一个字节, 并为之分配空间
(11)short
.short expressions: 定义一个短整型, 并为之分配空间
(12)int
.int expressions: 定义一个整型,并为之分配空间
(13)long
.long expressions: 定义一个长整型, 并为之分配空间
(14)word
.word expressions: 定义一个字,并为之分配空间, 4 bytes
(15)macro/endm
.macro: 定义一段宏代码, .macro表示代码的开始, .endm表示代码的结束, .exitm 跳出宏, 示例如下:
.macro SHIFTLEFT a, b
.if \b < 0
mov \a, \a, ASR #-\b
.exitm
.endif
mov \a, \a, LSL #\b
.endm
(16)req
name .req register name: 为寄存器定义一个别名
(17)code
.code [16|32]: 指定指令代码产生的长度, 16表示Thumb指令, 32表示ARM指令(18)ltorg
.ltorg: 表示当前往下的定义在归于当前段,并为之分配空间
2 ARM GNU专有符号
(1)@ 表示注释从当前位置到行尾的字符.
(2)# 注释掉一整行.
(3); 新行分隔符.
3 操作码
(1)NOP: nop 空操作, 相当于MOV r0, r0
(2)LDR: ldr
(3)ADR: adr
(4)ADRL: adrl
GNU的编译器和开发工具
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的所有开发工具都可以从上下载,基于ARM的工具可以从获得。GNU的编译器功能非常强大,共有上百个操作选项,这也是这类工具让初学者头痛的原因。不过,实际开发中只需要用到有限的几个,大部分可以采用缺省选项。GNU工具的开发流程如下:编写C、C++语言或汇编源程序,用gcc或g++生成目标文件,编写连接脚本文件,用连接器生成最终目标文件(elf格式),用二进制转换工具生成可下载的二进制代码。GNU工具都运行在Linux下,开发者需要1台运行Linux的PC作为上位机。由于篇幅所限,不能完整地介绍整个嵌入式操作系统的开发过程,将以第二节中提到的通过自举模式下载的引导程序为例,说明开发的过程。对于像Linux这样的大系统,基本的开发流程是一样的。
引导程序将通过自举模式下载到MX1的片内RAM,从地址0x00300000开始并执行。完成串口和SDRAM的初始化后,引导程序将等待接收应用程序或操作系统内核,将接收到的数据放在SDRAM中。数据接收完毕后,引导程序将SDRAM中的数据写入Flash,下一次就可以从Flash中直接引导系统了。由于操作系统的内核比较大,如Linux有1 MB以上,下载过程必须考虑纠错。因此,接收部分采用Xmode协议,可以用Windows下超级终端的Xmode发送方式发送文件。
(1)编写C、C++语言或汇编源程序
通常汇编源程序用于系统最基本的初始化,如初始化堆栈指针、设置页表、操作ARM 的协处理器等。初始化完成后就可以跳转到C代码执行。需要注意的是,GNU的汇编器遵循AT&T的汇编语法,读者可以从GNU的站点()上下载有关规范。汇编程序的缺省入口是start标号,用户也可以在连接脚本文件中用ENTRY标志指明其它入口点(见下文关于连接脚本的说明)。
(2)用gcc或g++生成目标文件
如果应用程序包括多个文件,就需要进行分别编译,最后用连接器连接起来。如笔者的引导程序包括3个文件:init.s(汇编代码、初始化硬件)xmrecever.c(通信模块,采用Xmode 协议)和flash.c(Flash擦写模块)。
分别用如下命令生成目标文件:
arm-linux-gcc-c-O2-o init.o init.s
arm-linux-gcc-c-O2-o xmrecever.o xmrecever.c