特殊符号 对应指令 意义
= DCB 分配一片接连的字节存储单元并用指定的数据初始化
& DCD 分配一片接连的字存储单元并用指定的数据初始化
% SPACE 分配一片接连的存储单元
^ MAP 界说一个结构化内存表的首地址
# FILED 界说一个结构化内存表的数据域(常常和MAP一使
& DCD 分配一片接连的字存储单元并用指定的数据初始化
% SPACE 分配一片接连的存储单元
^ MAP 界说一个结构化内存表的首地址
# FILED 界说一个结构化内存表的数据域(常常和MAP一使
用,一个界说开始地址,一个界说长度)
* EQU 为程序中的常量、标号等界说一个等效的字符称号,
* EQU 为程序中的常量、标号等界说一个等效的字符称号,
! 地址更新,成果写回到Rn中,Rn不允许是R15
[ | ] 相当于IF ELSE ENDIF
[ | ] 相当于IF ELSE ENDIF
其他:
LDM中{∧}为可选后缀,当指令为LDM且寄存器列表中包括R15,选用该后缀时一共:除了正常的数据传送之外,还将SPSR复制到CPSR。一起,该后缀还一共传入或传出的是用户形式下的寄存器,而不是当时形式下的寄存器。
TST R1,#%1 // 用于测验在寄存器R1中是否设置了最低位(%一共二进制数)
n
$:假如在串变量前有一个$则在汇编时编译器将用该串变量的数值替代该串变量,如:
GBLS STR1
GBLS STR2
STR1 SETS “pen.”
STR2 SETS “This is a $STR1″
编译后的成果是STR2的值为This is a pen.
假如$后是数字变量(与串变量委任),在汇编时编译器将该数字变量的数值转化成十六进制的串,然后用该十六进制的串替代$后的数字变量。
假如$后是逻辑变量,在汇编时编译器将该逻辑变量替换成它的取值(T或许F)。
假如程序中需求$,则用$$来一共,编译器将不进行变量替换。
留意:在两个竖线“|”之间的$并不一共进行变量替换,但假如“|”是在双引号内,则将进行变量替换。
B .//一共程序进入死循环。.为location counter,可在源文件中指示当时地址。该符号能够被引证或赋值。
ARM汇编程序中的符号
在ARM汇编语言中,符号(symbols)能够代表地址(addresse)、变量(variables)和数字常量(numeric constants)。当符号代表地址时,又称为标号(lable)。当标号以数字最初时,其效果规模为当时段(当时段没有运用ROUT伪操作时),这种标号又称为部分标号(lacal lable)。符号变量包括变量、数字常量、标号和部分标号。
1、变量
在程序中,变量的值在汇编处理过程中可能会产生改动。在ARM汇编中变量有数字变量、逻辑变量和串变量3种类型。变量的类型在程序中是不能够改动的。
数字变量的取值规模为数字常量和数字表达式所能一共的数值;逻辑变量的取值规模为{true}和{flash};串变量的取值规模为串表达式能够表达的规模。
在ARM汇编语言中,运用GBLA、GBLL及GBLS声明全局变量;运用LCLA、LCLL及LCLS声明部分变量;运用SETA、SETL及SETS为这些变量赋值。
2、数字常量
数字常量是32位的整数。在ARM汇编语言中,运用EQU来界说数字常量。数字常量一经界说就不行修正。 进行巨细比较时,以为数字常量都是无符号数。
3、汇编时变量的替换
假如在串变量前有一个$字符,在汇编时编译器将用改串的数值来替代该串变量。
关于数字变量来说,假如该变量前面有一个$字符,在汇编时编译器将该数字变量的数值转化成十六进制的串,然后用该十六进制的串替代$字符后的数字变量。
关于逻辑变量来说,假如该逻辑变量前面有一个$字符,在汇编时编译器将该逻辑变量替换成它的取值(T或许F)
假如程序中需求字符$,则用$$来一共,编译器将不进行变量替换,而是将$$当作$.
一般情况下,包括在两个竖线(|)之间的$并不一共进行变量替换。可是假如竖线(|)是在双引号内,则将进行变量替换。
运用“.”来一共变量称号的完毕。
4、标号
标号是一共程序中的指令或许数据地址的符号。依据标号的生成方法可分为3种:
根据PC的标号。根据PC的标号是坐落方针指令前或许程序中数据界说伪操作前的标号。这种标号在汇编时将被处理成PC值加上(或减去)一个数字常量。常用于一共跳转指令的方针地址,或许代码段中所嵌入的少数数据。
根据寄存器的标号。根据寄存器的标号常用MAP和FIELD未界说操作,也能够该用EQU伪界说。这种标号在汇编时将被处理成寄存器的值加上(或减去)一个数据常量。常用于拜访数据段中的数据。
肯定地址。肯定地址是一个32位数据。它能够寻址2^32 -1,即直接能够寻址整个内存空间。
5、部分标号
部分标号主要在部分规模内运用。它由两部组成:最初是一个0-99直接的数字,后边紧接一个一般一共该部分变量效果规模的符号。
部分变量的效果规模一般为当时段,也能够用伪操作ROUT来界说部分变量的效果规模。
部分变量界说的语法格局如下:
N{routname},其间,N为0~99之间的数字。routname为符号,一般为该变量效果规模的称号(用ROUT伪操作界说的)。
部分变量引证的语法格局如下:
%{F|B}{A|T}N{routname}
其间,N为部分变量的数字号。
routname 为当时效果规模的称号(用ROUT伪操作界说的)
%一共引证操作
F指示编译器只向前查找
B指示编译器只向后查找
A指示编译器查找宏的一切嵌套层次
T指示编译器查找宏的当时层次
假如F和B都没有指定,编译器先向前查找,再向后查找
假如A和T都没有指定,编译器查找一切从当时层次到宏的最高层次,比当时层次低的层次不再查找。
假如指定了routname,编译器向前查找最近的ROUT伪操作,若routname与该ROUT伪操作界说的称号不匹配,编译器陈述过错,汇编失利。
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
在ARM汇编语言中,符号(symbols)能够代表地址(addresse)、变量(variables)和数字常量(numeric constants)。当符号代表地址时,又称为标号(lable)。当标号以数字最初时,其效果规模为当时段(当时段没有运用ROUT伪操作时),这种标号又称为部分标号(lacal lable)。符号变量包括变量、数字常量、标号和部分标号。
1、变量
在程序中,变量的值在汇编处理过程中可能会产生改动。在ARM汇编中变量有数字变量、逻辑变量和串变量3种类型。变量的类型在程序中是不能够改动的。
数字变量的取值规模为数字常量和数字表达式所能一共的数值;逻辑变量的取值规模为{true}和{flash};串变量的取值规模为串表达式能够表达的规模。
在ARM汇编语言中,运用GBLA、GBLL及GBLS声明全局变量;运用LCLA、LCLL及LCLS声明部分变量;运用SETA、SETL及SETS为这些变量赋值。
2、数字常量
数字常量是32位的整数。在ARM汇编语言中,运用EQU来界说数字常量。数字常量一经界说就不行修正。 进行巨细比较时,以为数字常量都是无符号数。
3、汇编时变量的替换
假如在串变量前有一个$字符,在汇编时编译器将用改串的数值来替代该串变量。
关于数字变量来说,假如该变量前面有一个$字符,在汇编时编译器将该数字变量的数值转化成十六进制的串,然后用该十六进制的串替代$字符后的数字变量。
关于逻辑变量来说,假如该逻辑变量前面有一个$字符,在汇编时编译器将该逻辑变量替换成它的取值(T或许F)
假如程序中需求字符$,则用$$来一共,编译器将不进行变量替换,而是将$$当作$.
一般情况下,包括在两个竖线(|)之间的$并不一共进行变量替换。可是假如竖线(|)是在双引号内,则将进行变量替换。
运用“.”来一共变量称号的完毕。
4、标号
标号是一共程序中的指令或许数据地址的符号。依据标号的生成方法可分为3种:
根据PC的标号。根据PC的标号是坐落方针指令前或许程序中数据界说伪操作前的标号。这种标号在汇编时将被处理成PC值加上(或减去)一个数字常量。常用于一共跳转指令的方针地址,或许代码段中所嵌入的少数数据。
根据寄存器的标号。根据寄存器的标号常用MAP和FIELD未界说操作,也能够该用EQU伪界说。这种标号在汇编时将被处理成寄存器的值加上(或减去)一个数据常量。常用于拜访数据段中的数据。
肯定地址。肯定地址是一个32位数据。它能够寻址2^32 -1,即直接能够寻址整个内存空间。
5、部分标号
部分标号主要在部分规模内运用。它由两部组成:最初是一个0-99直接的数字,后边紧接一个一般一共该部分变量效果规模的符号。
部分变量的效果规模一般为当时段,也能够用伪操作ROUT来界说部分变量的效果规模。
部分变量界说的语法格局如下:
N{routname},其间,N为0~99之间的数字。routname为符号,一般为该变量效果规模的称号(用ROUT伪操作界说的)。
部分变量引证的语法格局如下:
%{F|B}{A|T}N{routname}
其间,N为部分变量的数字号。
routname 为当时效果规模的称号(用ROUT伪操作界说的)
%一共引证操作
F指示编译器只向前查找
B指示编译器只向后查找
A指示编译器查找宏的一切嵌套层次
T指示编译器查找宏的当时层次
假如F和B都没有指定,编译器先向前查找,再向后查找
假如A和T都没有指定,编译器查找一切从当时层次到宏的最高层次,比当时层次低的层次不再查找。
假如指定了routname,编译器向前查找最近的ROUT伪操作,若routname与该ROUT伪操作界说的称号不匹配,编译器陈述过错,汇编失利。
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