微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > GNU风格 ARM汇编语法指南

GNU风格 ARM汇编语法指南

时间:11-20 来源:互联网 点击:
汇编源程序一般用于系统最基本的初始化:初始化堆栈指针、设置页表、操作 ARM的协处理器等。这些初始化工作完成后就可以跳转到C代码main函数中执行。

1、GNU汇编语言语句格式

任何Linux汇编行都是如下结构:[

linstruction为指令

ldirective为伪操作

lpseudo-instruction为伪指令

l

lcomment为语句的注释

下面定义一个"add"的函数,最终返回两个参数的和:

.section .text, “x”

.global add @ give the symbol “add” external linkage

add:

ADD r0, r0, r1 @ add input arguments

MOV pc, lr @ return from subroutine

@ end of program

注意:

lARM指令,伪指令,伪操作,寄存器名可以全部为大写字母,也可全部为小写字母,但不可大小写混用。

l如果语句太长,可以将一条语句分几行来书写,在行末用“\”表示换行(即下一行与本行为同一语句)。“\”后不能有任何字符,包含空格和制表符(Tab)。

2、GNU汇编程序中的标号symbol(或label)

标号只能由a~z,A~Z,0~9,“.”,_等(由点、字母、数字、下划线等组成,除局部标号外,不能以数字开头)字符组成。

Symbol的本质:代表它所在的地址,因此也可以当作变量或者函数来使用。

l段内标号的地址值在汇编时确定;

l段外标号的地址值在连接时确定。

Symbol的分类:3类(依据标号的生成方式)。

<1>基于PC的标号。基于PC的标号是位于目标指令前的标号或者程序中数据定义伪操作前的标号。这种标号在汇编时将被处理成PC值加上(或减去)一个数字常量,常用于表示跳转指令”b”等的目标地址,或者代码段中所嵌入的少量数据。

<2>基于寄存器的标号。基于寄存器的标号常用MAP和FIELD来定义,也可以用EQU来定义。这种标号在汇编时将被处理成寄存器的值加上(或减去)一个数字常量,常用于访问数据段中的数据。

<3>绝对地址。绝对地址是一个32位数据。它可以寻址的范围为[0,232-1]即可以直接寻址整个内存空间。

特别说明:局部标号Symbol

局部标号主要在局部范围内使用,而且局部标号可以重复出现。它由两部组成:开头是一个0-99直接的数字,后面紧接一个通常表示该局部变量作用范围的符号。局部变量的作用范围通常为当前段,也可以用ROUT来定义局部变量的作用范围。

局部变量定义的语法格式:N{routname}

lN:为0~99之间的数字。

lroutname:当前局部范围的名称(为符号),通常为该变量作用范围的名称(用ROUT伪操作定义的)。

局部变量引用的语法格式:%{F|B}{A|T}N{routname}

l%:表示引用操作

lN:为局部变量的数字号

lroutname:为当前作用范围的名称(用ROUT伪操作定义的)

lF:指示编译器只向前搜索

lB:指示编译器只向后搜索

lA:指示编译器搜索宏的所有嵌套层次

lT:指示编译器搜索宏的当前层次

例:使用局部符号的例子,一段循环程序

1:

subs r0, r0, #1 @每次循环使r0=r0-1

bne 1F @跳转到1标号去执行

注意:

l如果F和B都没有指定,编译器先向前搜索,再向后搜索

l如果A和T都没有指定,编译器搜索所有从当前层次到宏的最高层次,比当前层次低的层次不再搜索。

l如果指定了routname,编译器向前搜索最近的ROUT伪操作,若routname与该ROUT伪操作定义的名称不匹配,编译器报告错误,汇编失败。

3、GNU汇编程序中的分段

<1>.section伪操作

.section {,””}

Starts a new code or data section. Sections in GNU are called .text, a code section, .data, an initialized data section, and .bss, an uninitialized data section.

These sections have default flags, and the linker understands the default names(similar directive to the armasm directive AREA).The following are allowable.section flagsfor ELF format files:

Meaning

a allowable section

w writable section

x executable section

中文解释:

用户可以通过.section伪操作来自定义一个段,格式如下:

.section section_name [, "flags"[, %type[,flag_specific_arguments]]]

每一个段以段名为开始, 以下一个段名或者文件结尾为结束。这些段都有缺省的标志(flags),连接器可以识别这些标志。(与arm asm中的AREA相同)。下面是ELF格式允许的段标志flags:

<标志> 含义

a 允许段

w 可写段

x 执行段

例:定义一个“段”

.section .mysection @自定义数据段,段名为 “.mysection”

.align 2

strtemp:

.ascii "Temp

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top