×
嵌入式 > 嵌入式开发 > 详情

ARM汇编书写格式及符号(symbol)和表达式(expr)

发布时间:2020-08-10 发布时间:
|
汇编语言的语句格式如下:

{symbol}{instruction/directive/pseud0-instruction}{;comment}

symbol:标号/局部标号/常量/变量

instruction:指令

directive:伪操作

pseudo-instruction:伪指令

comment:注释

{}中括号内是可选

注意:

1.symbol必须顶格书写。(ARM汇编其后不加“:”)(GUN汇编要加“:”)

2.symbol命名规则:由字母,数字,下划线组成;除局部标号外,不能以数字开头。

3.指令不能顶格书写。

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

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

ARM汇编语言中的符号

symbol(标号)

本质:代表一个地址值。段内标号的地址值在汇编时确定;段外标号的地址值在连接时确定。

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

基于PC的标号。基于PC的标号是位于目标指令前的标号或者程序中数据定义伪操作前的标号。这种标号在汇编时将被处理成PC值加上(或减去)一个数字常量。(常用于表示跳转指令的目标地址,或者代码段中所嵌入的少量数据。)
基于寄存器的标号。基于寄存器的标号常用MAP和FIELD来定义,也可以用EQU来定义。这种标号在汇编时将被处理成寄存器的值加上(或减去)一个数字常量。(常用于访问数据段中的数据。)
绝对地址。绝对地址是一个32位 数据。它可以寻址的范围为[0,232-1]即可以直接寻址整个内存空间。

symbol(局部标号)
局部标号主要在局部范围内使用。它由两部组成:开头是一个0-99直接的数字,后面紧接一个通常表示该局部变量作用范围的符号。
局部变量的作用范围通常为当前段,也可以用ROUT来定义局部变量的作用范围。
局部变量定义的语法格式:N{routname}
N:为0~99之间的数字。

routname:当前局部范围的名称(为符号),通常为该变量作用范围的名称(用ROUT伪操作定义的)。
局部变量引用的语法格式:%{F|B}{A|T}N{routname}
%:表示引用操作

N:为局部变量的数字号。
routname 为当前作用范围的名称(用ROUT伪操作定义的)
%:表示引用操作
F:指示编译器只向前搜索
B:指示编译器只向后搜索
A:指示编译器搜索宏的所有嵌套层次
T:指示编译器搜索宏的当前层次
注意:1.如果F和B都没有指定,编译器先向前搜索,再向后搜索
2.如果A和T都没有指定,编译器搜索所有从当前层次到宏的最高层次,比当前层次低的层次不再搜索。
3.如果指定了routname,编译器向前搜索最近的ROUT伪操作,若routname与该ROUT伪操作定义的名称不匹配,编译器报告错误,汇编失败。

symbol(常量)

数字常量是32位的整数。在ARM汇编语言中,使用EQU来定义数字常量。数字常量一经定义就不可修改。进行大小比较时,认为数字常量都是无符号数。

{数字常量:十进制数,十六进制数,n_XXX(n表示n(2-9)进制数,XXX是具体的数,例如:8_3777)

字符常量:用一对单引号括起,包含一个单字符或标准C中的转义字符。例如:‘A’‘n’

字符串常量:由一对双引号括起,包含一个字符串或标准C中的转义字符

布尔常量:{TRUE}和{FALSE}

}

注意:1.汇编器对-n和2^32-1不做区别;汇编时对关系运算符采用无符号数方式处理,这就意味着当0>-1是

{FLASE}的

symbol(变量)

在程序中,变量的值在汇编处理过程中可能会发生改变。在ARM汇编中变量有数字变量、逻辑变量和字符串变量3种类型。变量的类型在程序中是不可以改变的。
数字变量的取值范围为数字常量和数字表达式所能表示的数值;

无符号数[0,2的32次方-1],有符号数[负2的31次方,正2的31次方-1]

逻辑变量的取值范围为{true}和{flash};

字符串变量的取值范围为串表达式可以表达的范围。[0,512]字节

注意:汇编时变量的替换
1.如果在字符串变量前有一个$字符,在汇编时编译器将用改串的数值来取代该字符串变量。
2.如果在数字变量前面有一个$字符,在汇编时编译器将该数字变量的数值转换成十六进制的串,然后用该十六进制的串取代$字符后的数字变量。
3.如果在逻辑变量前面有一个$字符,在汇编时编译器将该逻辑变量替换成它的取值(T或者F)
4.如果程序中需要字符$,则用$$来表示,编译器将不进行变量替换,而是将$$当作$.
通常情况下,包含在两个竖线(|)之间的$并不表示进行变量替换。但是如果竖线(|)是在双引号内,则将进行变量替换。
5.使用“.”来表示变量名称的结束。

“.”也可能表示 当前指令地址(见下表)


ARM汇编语言中的表达式
表达式是由符号、数值、单目或多目操作符以及括号组成的。
1、字符串表达式
字符串表达式由字符串、字符串变量、操作符以及括号组成。字符串的最大长度为512字节,最小长度为0.下面介绍字符串表达式的组成元素。
字符串:由包含在双引号内的一系列的字符组成。字符串的长度受到ARM汇编语言语句长度的限制。当在字符串中包含美元符号$或者引号"时,用$$表示一个$,用""表示一个"。
字符串变量:用伪操作GBLS或者LCLS声明,用SETS赋值。
操作符:
(1)LEN:返回字符串的长度
:LEN:A
其中,A为字符串变量
(2)CHR:可以将0~255之间的整数作为含一个ASCII字符的字符串。当有些ASCII字符不方便放在字符串中时,可以使用CHR将其放在字符串表达式中。
:CHR:A
其中,A为某一字符的ASCII值
(3)STR:将一个数字量或者逻辑表达式转换成串。对于32位的数字量而言,STR将其转换成8个十六进制数组成的串;对于逻辑表达式而言,STR将其转换成字符串T或者F
:STR:A
其中,A为数字量或者逻辑表达式
(4)LEFT:返回一个字符串最左端一定长度的子串
A:LEFT:B
其中,A为源字符串,B为数字量,表示LEFT将返回的字符个数
(5)RIGHT:返回一个字符串最右端一定长度的子串
A:RIGHT:B
其中,A为源字符串,B为数字量,表示RIGHT将返回的字符个数
(6)CC:用于连接两个字符串。
A:CC:B
其中,A为第1个源字符串。B为第2个源字符串。CC操作符将字符串B连接在字符串A的后面。
2、数字表达式
数字表达式由数字常量、数字变量、操作符和括号组成
数字变量用伪操作GBLA或者LCLA声明,用SETA赋值,它代表一个32位的数字量。
操作符:
(1)NOT:按位取反
:NOT:A
其中,A为一个32位数字量
(2)+、—、×、/及MOD算术操作符
A+B,A-B,A×B,A/B
A:MOD:B表示A除以B的余数
(3)ROL,ROR,SHL,SHR移位
A:ROL:B将整数A循环左移B位
A:SHL:B将整数A左移B位
(4)AND、OR及EOR按位逻辑操作符
A:AND:B将数字表达式A和B按位作逻辑与操作
3、基于寄存器和基于PC的表达式
基于寄存器的表达式表示了某个寄存器的值加上(或者减去)一个数字表达式
基于PC的表达式表示了PC寄存器的值加上(或减去)一个数字表达式。基于PC的表达式通常由程序中的标号与一个数字表达式组成。相关的操作符:
(1)BASE:返回基于寄存器的表达式中的寄存器编号。
:BASE:A A为基于寄存器的表达式
(2)INDEX:返回基于寄存器的表达式相对于其基址寄存器的偏移量。
:INDEX:A A为基于寄存器的表达式
(3)+、﹣:正负号,可以放在数字表达式或者基于PC的表达式前面。
+A(﹣A) A为基于PC的表达式或者数字表达式
4、逻辑表达式
由逻辑量、逻辑操作符、关系操作符以及括号组成,取值范围为{FLASE}和{TRUE}
关系操作符:用于表示两个同类表达式之间的关系。关系操作符和它的两个操作数组成一个逻辑表达式,其取值为{FALSE}或{TRUE}
如A=B 表示A等于B
A/=B,A<>B表示A不等于B
逻辑操作符:进行两个逻辑表达式之间的基本逻辑操作。操作的结果为{FLASE}或{TRUE}
:LNOT:A 逻辑表达式A的值取反
A:LAND:B逻辑表达式A和B逻辑与
5、其他的一些操作符
(1)?:返回定义符号A的代码行所生成的可执行代码的字节数
?A
其中,A为一个符号
(2)DEF:判断某个符号是否已定义
:DEF:A
如果符号A已经定义,上述结果为{TRUE},否则为{FLASE}
(3)SB_OFFSET_19_12
:SB_OFFSET_19_12:label 其中,label为一个标号
返回(label-SB)的bits[19:12]
(4)SB_OFFSET_11_0
:SB_OFFSET_11_0:label
返回(label-SB)的bits[11:0]
参考文章

3. ARM嵌入式系统入门.三恒星科技.中国电力出版社

4. ARM嵌入式应用技术基础.刘凯.清华大学出版社



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
寻找半导体产业未来10年的驱动力