- 在汇编语言程序设计中,经常使用各种符号代替地址(addresses)、变量(variables)和常量(constants)等,以增加程序的灵活性和可读性。尽管符号的命名由编程者决定,但并不是任意的,必须遵循以下的约定。
- 符号区分大小写,同名的大小写符号会被编译器认为是两个不同的符号。[插图] 符号在其作用范围内必须唯一。
- 自定义的符号名不能与系统的保留字相同。其中保留字包括系统内部变量(built-in variable)和系统预定义(predefined symbol)的符号。
- 符号名不应与指令或伪指令同名。如果要使用和指令或伪指令同名的符号要用双竖杠“||”将其括起来,如“||ASSERT||”。
- 局部标号以数字开头,其他的符号都不能以数字开头。
(1)变量(variable)
(1)变量(variable)
程序中的变量是指其值在程序的运行过程中可以改变的量。ARM(Thumb)汇编程序所支持的变量有三种。
① 数字变量(numeric)。数字变量用于在程序的运行中保存数字值,但注意数字值的大小不应超出数字变量所能表示的范围。
② 逻辑变量(logical)。逻辑变量用于在程序的运行中保存逻辑值,逻辑值只有两种取值情况:真({TURE})或假({FALSE})。
③ 字符串变量(string)。字符串变量用于在程序的运行中保存一个字符串,但注意字符串的长度不应超出字符串变量所能表示的范围。
在ARM(Thumb)汇编语言程序设计中,可使用GBLA、GBLL、GBLS伪指令声明全局变量,使用LCLA、LCLL、LCLS伪指令声明局部变量,并可使用SETA、SETL和SETS对其进行初始化。
(2)常量(constants)
程序中的常量是指其值在程序的运行过程中不能被改变的量。ARM(Thumb)汇编程序所支持的常量有数字常量、逻辑常量和字符串常量。
数字常量一般为32位的整数,当作为无符号数时,其取值范围为0~232-1,当作为有符号数时,其取值范围为-231~231-1。汇编器认为-n和232-n是相等的。对于关系操作,如比较两个数的大小,汇编器将其操作数看做无符号的数。也就是说“0>-1”,对汇编器来说取值为“假({FLASE})”。
逻辑常量只有两种取值情况:真或假。
字符串常量为一个固定的字符串,一般用于程序运行时的信息提示。
(3)程序中的变量代换
汇编语言中的变量可以作为一整行出现在汇编程序中,也可以作为行的一部分使用。
如果在数字变量前面有一个代换操作符“$”,编译器会将该数字变量的值转换为十六进制的字符串,并将该十六进制的字符串代换“$”后的数字变量。
如果在逻辑变量前面有一个代换操作符“$”,编译器会将该逻辑变量代换为它的取值(真或假)。
如果在字符串变量前面有一个代换操作符“$”,编译器会将该字符串变量的值代换“$”后的字符串变量。
如果程序中需要字符“$”,则可以用“$$”来表示。汇编器将不进行变量替换,而是将“$$”作为“$”。
下面的两个例子说明了变量替换的过程。
; 直接的变量替换GBLS add4ff;add4ff SETS "ADD r4,r4,#0xFF" ; 给变量add4ff赋值$add4ff.00 ; 引用变量; codesADD r4,r4,#0xFF00
(4)程序标号(label)
在ARM汇编中,标号代表一个地址,段内标号的地址在汇编时确定,而段外标号地址值在链接时确定。根据标号的生成方式,可以有以下三种。
① 程序相关标号(Program-relative labels)。程序相关标号指位于目标指令前的标号或程序中的数据定义伪操作前的标号。这种标号在汇编时将被处理成PC值加上或减去一个数字常量。它常用于表示跳转指令的目标地址。
② 寄存器相关地址(Register-relative labels)。这种标号在汇编时将被处理成寄存器的值加上或减去一个数字常量。它常被用于访问位于数据段中的数据。这种基于寄存器的标号通常用MAP和FIELD伪操作定义,也可以用EQU伪操作定义。
③ 绝对地址(Absolute address)。绝对地址是一个32位的数字量,使用它可以直接寻址整个内存空间