4.2 汇编语言的语句格式
ARM(Thumb)汇编语言的语句格式为:
{标号} {指令或伪指令} {;注释}
在汇编语言程序设计中,每一条指令的助记符可以全部用大写、或全部用小写,但不用许在一条指令中大、小写混用。
同时,如果一条语句太长,可将该长语句分为若干行来书写,在行的末尾用“/”表示下一行与本行为同一条语句。
4.2.1 在汇编语言程序中常用的符号
在汇编语言程序设计中,经常使用各种符号代替地址、变量和常量等,以增加程序的可读性。尽管符号的命名由编程者决定,但并不是任意的,必须遵循以下的约定:
- 符号区分大小写,同名的大、小写符号会被编译器认为是两个不同的符号。
- 符号在其作用范围内必须唯一。
- 自定义的符号名不能与系统的保留字相同。
- 符号名不应与指令或伪指令同名。
1、 程序中的变量
程序中的变量是指其值在程序的运行过程中可以改变的量。ARM(Thumb)汇编程序所支持的变量有数字变量、逻辑变量和字符串变量。
数字变量用于在程序的运行中保存数字值,但注意数字值的大小不应超出数字变量所能表示的范围。
逻辑变量用于在程序的运行中保存逻辑值,逻辑值只有两种取值情况:真或假。
字符串变量用于在程序的运行中保存一个字符串,但注意字符串的长度不应超出字符串变量所能表示的范围。
在ARM(Thumb)汇编语言程序设计中,可使用GBLA、GBLL、GBLS伪指令声明全局变量,使用LCLA、LCLL、LCLS伪指令声明局部变量,并可使用SETA、SETL和SETS对其进行初始化。
2、 程序中的常量
程序中的常量是指其值在程序的运行过程中不能被改变的量。ARM(Thumb)汇编程序所支持的常量有数字常量、逻辑常量和字符串常量。
数字常量一般为32位的整数,当作为无符号数时,其取值范围为0~232-1,当作为有符号数时,其取值范围为-231~231-1。
逻辑常量只有两种取值情况:真或假。
字符串常量为一个固定的字符串,一般用于程序运行时的信息提示。
3、 程序中的变量代换
程序中的变量可通过代换操作取得一个常量。代换操作符为“$”。
如果在数字变量前面有一个代换操作符“$”,编译器会将该数字变量的值转换为十六进制的字符串,并将该十六进制的字符串代换“$”后的数字变量。
如果在逻辑变量前面有一个代换操作符“$”,编译器会将该逻辑变量代换为它的取值(真或假)。
如果在字符串变量前面有一个代换操作符“$”,编译器会将该字符串变量的值代换“$”后的字符串变量。
使用示例:
LCLS S1 ;定义局部字符串变量S1和S2
LCLS S2
S1 SETS “Test!”
S2 SETS “This is a $S1” ;字符串变量S2的值为“This is a Test!”
4.2.2 汇编语言程序中的表达式和运算符
在汇编语言程序设计中,也经常使用各种表达式,表达式一般由变量、常量、运算符和括号构成。常用的表达式有数字表达式、逻辑表达式和字符串表达式,其运算次序遵循如下的优先级:
- 优先级相同的双目运算符的运算顺序为从左到右。
- 相邻的单目运算符的运算顺序为从右到左,且单目运算符的优先级高于其他运算符。
- 括号运算符的优先级最高。
1、 数字表达式及运算符
数字表达式一般由数字常量、数字变量、数字运算符和括号构成。与数字表达式相关的运算符如下:
- “+”、“-”、“×”、“/” 及“MOD”算术运算符
以上的算术运算符分别代表加、减、乘、除和取余数运算。例如,以X和Y表示两个数字表达式,则:
X+Y 表示X与Y的和。
X-Y 表示X与Y的差。
X×Y 表示X与Y的乘积。
X/Y 表示X除以Y的商。
X:MOD:Y 表示X除以Y的余数。
- “ROL”、“ROR”、“SHL”及“SHR”移位运算符
以X和Y表示两个数字表达式,以上的移位运算符代表的运算如下:
X:ROL:Y 表示将X循环左移Y位。
X:ROR:Y 表示将X循环右移Y位。
X:SHL:Y 表示将X左移Y位。
X:SHR:Y 表示将X右移Y位。
- “AND”、“OR”、“NOT”及“EOR”按位逻辑运算符
以X和Y表示两个数字表达式,以上的按位逻辑运算符代表的运算如下:
X:AND:Y 表示将X和Y按位作逻辑与的操作。
X:OR:Y 表示将X和Y按位作逻辑或的操作。
:NOT:Y 表示将Y按位作逻辑非的操作。
X:EOR:Y 表示将X和Y按位作逻辑异或的操作。
2、 逻辑表达式及运算符
逻辑表达式一般由逻辑量、逻辑运算符和括号构成,其表达式的运算结果为真或假。与逻辑表达式相关的运算符如下:
- “=”、“>”、“<”、“>=”、“<= ”、“/=”、“ <>” 运算符
以X和Y表示两个逻辑表达式,以上的运算符代表的运算如下:
X = Y 表示X等于Y。
X > Y 表示X大于Y。
X < Y 表示X小于Y。
X >= Y 表示X大于等于Y。
X <= Y 表示X小于等于Y。
X /= Y 表示X不等于Y。
X <> Y 表示X不等于Y。
- “LAND”、“LOR”、“LNOT”及“LEOR”运算符
以X和Y表示两个逻辑表达式,以上的逻辑运算符代表的运算如下:
X:LAND:Y 表示将X和Y 作逻辑与的操作。
X:LOR:Y 表示将X和Y作逻辑或的操作。
:LNOT:Y 表示将Y作逻辑非的操作。
X:LEOR:Y 表示将X和Y作逻辑异或的操作。
3、 字符串表达式及运算符
字符串表达式一般由字符串常量、字符串变量、运算符和括号构成。编译器所支持的字符串最大长度为512字节。常用的与字符串表达式相关的运算符如下:
- LEN运算符
LEN运算符返回字符串的长度(字符数),以X表示字符串表达式,其语法格式如下:
:LEN:X
- CHR运算符
CHR运算符将0~255之间的整数转换为一个字符,以M表示某一个整数,其语法格式如下:
:CHR:M
- STR运算符
STR运算符将将一个数字表达式或逻辑表达式转换为一个字符串。对于数字表达式,STR运算符将其转换为一个以十六进制组成的字符串;对于逻辑表达式,STR运算符将其转换为字符串T或F,其语法格式如下:
:STR:X
其中,X为一个数字表达式或逻辑表达式。
- LEFT运算符
LEFT运算符返回某个字符串左端的一个子串,其语法格式如下:
X:LEFT:Y
其中:X为源字符串,Y为一个整数,表示要返回的字符个数。
- RIGHT运算符
与LEFT运算符相对应,RIGHT运算符返回某个字符串右端的一个子串,其语法格式如下:
X:RIGHT:Y
其中:X为源字符串,Y为一个整数,表示要返回的字符个数。
- CC运算符
CC运算符用于将两个字符串连接成一个字符串,其语法格式如下:
X:CC:Y
其中:X为源字符串1,Y为源字符串2,CC运算符将Y连接到X的后面。
4、 与寄存器和程序计数器(PC)相关的表达式及运算符
常用的与寄存器和程序计数器(PC)相关的表达式及运算符如下:
- BASE运算符
BASE运算符返回基于寄存器的表达式中寄存器的编号,其语法格式如下:
:BASE:X
其中,X为与寄存器相关的表达式。
- INDEX运算符
INDEX运算符返回基于寄存器的表达式中相对于其基址寄存器的偏移量,其语法格式如下:
:INDEX:X
其中,X为与寄存器相关的表达式。
5、 其他常用运算符
- ?运算符
?运算符返回某代码行所生成的可执行代码的长度,例如:
?X
返回定义符号X的代码行所生成的可执行代码的字节数。
- DEF运算符
DEF运算符判断是否定义某个符号,例如:
:DEF:X
如果符号X已经定义,则结果为真,否则为假。
ARM(Thumb)汇编语言的语句格式为:
{标号} {指令或伪指令} {;注释}
在汇编语言程序设计中,每一条指令的助记符可以全部用大写、或全部用小写,但不用许在一条指令中大、小写混用。
同时,如果一条语句太长,可将该长语句分为若干行来书写,在行的末尾用“/”表示下一行与本行为同一条语句。
4.2.1 在汇编语言程序中常用的符号
在汇编语言程序设计中,经常使用各种符号代替地址、变量和常量等,以增加程序的可读性。尽管符号的命名由编程者决定,但并不是任意的,必须遵循以下的约定:
- 符号区分大小写,同名的大、小写符号会被编译器认为是两个不同的符号。
- 符号在其作用范围内必须唯一。
- 自定义的符号名不能与系统的保留字相同。
- 符号名不应与指令或伪指令同名。
1、 程序中的变量
程序中的变量是指其值在程序的运行过程中可以改变的量。ARM(Thumb)汇编程序所支持的变量有数字变量、逻辑变量和字符串变量。
数字变量用于在程序的运行中保存数字值,但注意数字值的大小不应超出数字变量所能表示的范围。
逻辑变量用于在程序的运行中保存逻辑值,逻辑值只有两种取值情况:真或假。
字符串变量用于在程序的运行中保存一个字符串,但注意字符串的长度不应超出字符串变量所能表示的范围。
在ARM(Thumb)汇编语言程序设计中,可使用GBLA、GBLL、GBLS伪指令声明全局变量,使用LCLA、LCLL、LCLS伪指令声明局部变量,并可使用SETA、SETL和SETS对其进行初始化。
2、 程序中的常量
程序中的常量是指其值在程序的运行过程中不能被改变的量。ARM(Thumb)汇编程序所支持的常量有数字常量、逻辑常量和字符串常量。
数字常量一般为32位的整数,当作为无符号数时,其取值范围为0~232-1,当作为有符号数时,其取值范围为-231~231-1。
逻辑常量只有两种取值情况:真或假。
字符串常量为一个固定的字符串,一般用于程序运行时的信息提示。
3、 程序中的变量代换
程序中的变量可通过代换操作取得一个常量。代换操作符为“$”。
如果在数字变量前面有一个代换操作符“$”,编译器会将该数字变量的值转换为十六进制的字符串,并将该十六进制的字符串代换“$”后的数字变量。
如果在逻辑变量前面有一个代换操作符“$”,编译器会将该逻辑变量代换为它的取值(真或假)。
如果在字符串变量前面有一个代换操作符“$”,编译器会将该字符串变量的值代换“$”后的字符串变量。
使用示例:
LCLS S1 ;定义局部字符串变量S1和S2
LCLS S2
S1 SETS “Test!”
S2 SETS “This is a $S1” ;字符串变量S2的值为“This is a Test!”
4.2.2 汇编语言程序中的表达式和运算符
在汇编语言程序设计中,也经常使用各种表达式,表达式一般由变量、常量、运算符和括号构成。常用的表达式有数字表达式、逻辑表达式和字符串表达式,其运算次序遵循如下的优先级:
- 优先级相同的双目运算符的运算顺序为从左到右。
- 相邻的单目运算符的运算顺序为从右到左,且单目运算符的优先级高于其他运算符。
- 括号运算符的优先级最高。
1、 数字表达式及运算符
数字表达式一般由数字常量、数字变量、数字运算符和括号构成。与数字表达式相关的运算符如下:
- “+”、“-”、“×”、“/” 及“MOD”算术运算符
以上的算术运算符分别代表加、减、乘、除和取余数运算。例如,以X和Y表示两个数字表达式,则:
X+Y 表示X与Y的和。
X-Y 表示X与Y的差。
X×Y 表示X与Y的乘积。
X/Y 表示X除以Y的商。
X:MOD:Y 表示X除以Y的余数。
- “ROL”、“ROR”、“SHL”及“SHR”移位运算符
以X和Y表示两个数字表达式,以上的移位运算符代表的运算如下:
X:ROL:Y 表示将X循环左移Y位。
X:ROR:Y 表示将X循环右移Y位。
X:SHL:Y 表示将X左移Y位。
X:SHR:Y 表示将X右移Y位。
- “AND”、“OR”、“NOT”及“EOR”按位逻辑运算符
以X和Y表示两个数字表达式,以上的按位逻辑运算符代表的运算如下:
X:AND:Y 表示将X和Y按位作逻辑与的操作。
X:OR:Y 表示将X和Y按位作逻辑或的操作。
:NOT:Y 表示将Y按位作逻辑非的操作。
X:EOR:Y 表示将X和Y按位作逻辑异或的操作。
2、 逻辑表达式及运算符
逻辑表达式一般由逻辑量、逻辑运算符和括号构成,其表达式的运算结果为真或假。与逻辑表达式相关的运算符如下:
- “=”、“>”、“<”、“>=”、“<= ”、“/=”、“ <>” 运算符
以X和Y表示两个逻辑表达式,以上的运算符代表的运算如下:
X = Y 表示X等于Y。
X > Y 表示X大于Y。
X < Y 表示X小于Y。
X >= Y 表示X大于等于Y。
X <= Y 表示X小于等于Y。
X /= Y 表示X不等于Y。
X <> Y 表示X不等于Y。
- “LAND”、“LOR”、“LNOT”及“LEOR”运算符
以X和Y表示两个逻辑表达式,以上的逻辑运算符代表的运算如下:
X:LAND:Y 表示将X和Y 作逻辑与的操作。
X:LOR:Y 表示将X和Y作逻辑或的操作。
:LNOT:Y 表示将Y作逻辑非的操作。
X:LEOR:Y 表示将X和Y作逻辑异或的操作。
3、 字符串表达式及运算符
字符串表达式一般由字符串常量、字符串变量、运算符和括号构成。编译器所支持的字符串最大长度为512字节。常用的与字符串表达式相关的运算符如下:
- LEN运算符
LEN运算符返回字符串的长度(字符数),以X表示字符串表达式,其语法格式如下:
:LEN:X
- CHR运算符
CHR运算符将0~255之间的整数转换为一个字符,以M表示某一个整数,其语法格式如下:
:CHR:M
- STR运算符
STR运算符将将一个数字表达式或逻辑表达式转换为一个字符串。对于数字表达式,STR运算符将其转换为一个以十六进制组成的字符串;对于逻辑表达式,STR运算符将其转换为字符串T或F,其语法格式如下:
:STR:X
其中,X为一个数字表达式或逻辑表达式。
- LEFT运算符
LEFT运算符返回某个字符串左端的一个子串,其语法格式如下:
X:LEFT:Y
其中:X为源字符串,Y为一个整数,表示要返回的字符个数。
- RIGHT运算符
与LEFT运算符相对应,RIGHT运算符返回某个字符串右端的一个子串,其语法格式如下:
X:RIGHT:Y
其中:X为源字符串,Y为一个整数,表示要返回的字符个数。
- CC运算符
CC运算符用于将两个字符串连接成一个字符串,其语法格式如下:
X:CC:Y
其中:X为源字符串1,Y为源字符串2,CC运算符将Y连接到X的后面。
4、 与寄存器和程序计数器(PC)相关的表达式及运算符
常用的与寄存器和程序计数器(PC)相关的表达式及运算符如下:
- BASE运算符
BASE运算符返回基于寄存器的表达式中寄存器的编号,其语法格式如下:
:BASE:X
其中,X为与寄存器相关的表达式。
- INDEX运算符
INDEX运算符返回基于寄存器的表达式中相对于其基址寄存器的偏移量,其语法格式如下:
:INDEX:X
其中,X为与寄存器相关的表达式。
5、 其他常用运算符
- ?运算符
?运算符返回某代码行所生成的可执行代码的长度,例如:
?X
返回定义符号X的代码行所生成的可执行代码的字节数。
- DEF运算符
DEF运算符判断是否定义某个符号,例如:
:DEF:X
如果符号X已经定义,则结果为真,否则为假。