ARM GNU 汇编伪指令简介,编译器和开发工具,用GNU工具开发基于ARM的嵌入式系统

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 , = 相当于PC寄存器或其它寄存器的长转移

(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

相关文档
最新文档