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

GNU风格 ARM汇编语法指南

时间:11-20 来源:互联网 点击:

.include “myarmasm.h”

l.incbin伪操作可以将原封不动的一个二进制文件编译到当前文件中,使用方法如下:

.incbin "file"[,skip[,count]]

skip表明是从文件开始跳过skip个字节开始读取文件,count是读取的字数.

<4>..if伪操作

根据一个表达式的值来决定是否要编译下面的代码, 用.endif伪操作来表示条件判断的结束,中间可以使用.else来决定.if的条件不满足的情况下应该编译哪一部分代码。

.if有多个变种:

.ifdef symbol @判断symbol是否定义

.ifc string1,string2 @字符串string1和string2是否相等,字符串可以用单引号括起来

.ifeq expression @判断expression的值是否为0

.ifeqs string1,string2 @判断string1和string2是否相等,字符串必须用双引号括起来

.ifge expression @判断expression的值是否大于等于0

.ifgt absolute expression @判断expression的值是否大于0

.ifle expression @判断expression的值是否小于等于0

.iflt absolute expression @判断expression的值是否小于0

.ifnc string1,string2 @判断string1和string2是否不相等, 其用法跟.ifc恰好相反。

.ifndef symbol, .ifnotdef symbol @判断是否没有定义symbol, 跟.ifdef恰好相反

.ifne expression @如果expression的值不是0, 那么编译器将编译下面的代码

.ifnes string1,string2 @如果字符串string1和string2不相等, 那么编译器将编译下面的代码.

<5>.global .type .title .list

l.global/ .globl :用来定义一个全局的符号,格式如下:

.global symbol 或者 .globl symbol

l.type:用来指定一个符号的类型是函数类型或者是对象类型, 对象类型一般是数据, 格式如下:

.type 符号, 类型描述

例:

.globl a

.data

.align 4

.type a, @object

.size a, 4

a:

.long 10

例:

.section .text

.type asmfunc, @function

.globl asmfunc

asmfunc:

mov pc, lr

<6>列表控制语句:

.title:用来指定汇编列表的标题,例如:

.title “my program”

.list:用来输出列表文件.

<7>ARM特有的伪操作

l.reg: 用来给寄存器赋予别名,格式如下:

别名 .req 寄存器名

l.unreq: 用来取消一个寄存器的别名,格式如下:

.unreq 寄存器别名

注意被取消的别名必须事先定义过,否则编译器就会报错,这个伪操作也可以用来取消系统预制的别名, 例如r0, 但如果没有必要的话不推荐那样做。

l.code伪操作用来选择ARM或者Thumb指令集,格式如下:

.code 表达式

如果表达式的值为16则表明下面的指令为Thumb指令,如果表达式的值为32则表明下面的指令为ARM指令.

l.thumb伪操作等同于.code 16, 表明使用Thumb指令, 类似的.arm等同于.code 32

l.force_thumb伪操作用来强制目标处理器选择thumb的指令集而不管处理器是否支持

l.thumb_func伪操作用来指明一个函数是thumb指令集的函数

l.thumb_set伪操作的作用类似于.set, 可以用来给一个标志起一个别名, 比.set功能增加的一点是可以把一个标志标记为thumb函数的入口, 这点功能等同于.thumb_func

l.ltorg用于声明一个数据缓冲池(literal pool)的开始,它可以分配很大的空间。

l.pool的作用等同.ltorg

l.space {,}

分配number_of_bytes字节的数据空间,并填充其值为fill_byte,若未指定该值,缺省填充0。(与armasm中的SPACE功能相同)

l.word {,} …

插入一个32-bit的数据队列。(与armasm中的DCD功能相同)。可以使用.word把标识符作为常量使用。

例:

Start:

valueOfStart:

.word Start

这样程序的开头Start便被存入了内存变量valueOfStart中。

l.hword {,} …

插入一个16-bit的数据队列。(与armasm中的DCW相同)

8、GNU ARM汇编特殊字符和语法

<1>代码行中的注释符号:‘@’

<2>整行注释符号: ‘#’

<3>语句分离符号: ‘;’

<4>立即数前缀: ‘#’ 或 ‘$’

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

网站地图

Top