4.1.5 ARM汇编器所支持的伪指令(2)
(3) 用于对变量赋值的SETA、SETL、SETS
功能:伪指令SETA、SETL、SETS用于给一个已经定义的全局变量或局部变量赋值。其中,
SETA伪指令用于给一个数学变量赋值;
SETL伪指令用于给一个逻辑变量赋值;
SETS伪指令用于给一个字符串变量赋值。
语法:
变量名 SETA(SETL或SETS) 表达式
例如,定义变量sum,格式为:
- SETA sum;
(4) 为通用寄存器列表定义名称的RLIST
功能:为一个通用寄存器列表定义名称。
语法:
- 名称 RLIST {寄存器列表}
例如将寄存器列表R0-R5、R8、R10定义为RegLst,可在ARM指令LDM/STM中通过该名称访问寄存器列表,则格式如下:
- RegLst RLIST {R0-R5,R8,R10};
2. 数据定义伪指令
数据定义伪指令用于数据表定义、文字池、数据空间分配,同时可完成已分配存储单元的初始化。
常见的数据定义伪指令有如下几种。
DCB 用于分配一片连续的字节存储单元并用指定的数据初始化。
DCW(DCWU)用于分配一片连续的半字存储单元并用指定的数据初始化。
DCD(DCDU)用于分配一片连续的字存储单元并用指定的数据初始化。
DCFD(DCFDU)用于为双精度的浮点数分配一片连续的字存储单元并用指定的数据初始化。
DCFS(DCFSU) 用于为单精度的浮点数分配一片连续的字存储单元并用指定的数据初始化。
DCQ(DCQU) 用于分配一片以8字节为单位的连续的存储单元并用指定的数据初始化。
SPACE 用于分配一片连续的存储单元。
MAP 用于定义一个结构化的内存表首地址。
FIELD 用于定义一个结构化的内存表的数据域。
3. 汇编控制伪指令
汇编控制伪指令用于控制汇编程序的执行流程,比如条件汇编、宏定义和重复汇编控制等。
(1) 条件伪指令
语法:
- IF 逻辑表达式
- 指令序列1
- ELSE
- 指令序列2
- ENDIF
功能:IF、ELSE、ENDIF伪指令能根据条件的成立与否决定是否执行某个指令序列。当IF后面的逻辑表达式为真,则执行指令序列1,否则执行指令序列2。其中,ELSE及指令序列2可以没有,此时,当IF后面的逻辑表达式为真,则执行指令序列1,否则继续执行后面的指令。
(2) 循环伪指令
语法:
- WHILE 逻辑表达式
- 指令序列
- WEND
功能:WHILE、WEND伪指令能根据条件的成立与否决定是否循环执行某个指令序列。当WHILE后面的逻辑表达式为真,则执行指令序列,该指令序列执行完毕后,再判断逻辑表达式的值,若为真则继续执行,一直到逻辑表达式的值为假。
4. 宏指令
功能:MACRO、MEND伪指令可以将一段代码定义为一个整体,称为宏指令,然后就可以在程序中通过宏指令多次调用该段代码。其中,$标号在宏指令被展开时,会被替换为用户定义的符号,宏指令可以使用一个或多个参数,当宏指令被展开时,这些参数被相应的值替换。
包含在MACRO和MEND之间的指令序列称为宏定义体,在宏定义体的第一行应声明宏的原型(包括宏名、所需参数),然后就可以在汇编程序中通过宏名来调用该指令序列。在源程序被编译时,汇编器将宏调用展开,用宏定义中的指令序列代替程序中的宏调用,并将参数的值传递给宏定义中的形式参数。
宏指令的语法格式如下:
- MACRO
-
- $标号 宏名 $参数1,$参数2,……
-
- 指令序列
-
- MEND
注:MACRO、MEND伪操作可以嵌套使用。
5. 其他常用的伪指令
除了上面介绍的伪指令外,还有其他一些伪指令,在汇编程序中经常会被使用,如段定义伪指令、入口点设置伪指令、包含文件伪指令、标号导出或导入声明伪指令等。具体包括以下内容。
ALIGN:可通过添加填充字节的方式,使当前位置满足一定的对齐方式。
CODE16、CODE32:CODE16伪指令通知编译器,其后的指令序列为16位的Thumb指令。CODE32伪指令通知编译器,其后的指令序列为32位的ARM指令。
ENTRY:用于指定汇编程序的入口点。在一个完整的汇编程序中至少要有一个ENTRY(也可以有多个,当有多个ENTRY时,程序的真正入口点由链接器指定),但在一个源文件里最多只能有一个ENTRY(可以没有)。
END:用于通知编译器已经到了源程序的结尾。
EQU:用于为程序中的常量、标号等定义一个等效的字符名称,类似于C语言中的#define。
EXPORT(或GLOBAL):用于在程序中声明一个全局的标号,该标号可在其他的文件中引用。
IMPORT:用于通知编译器要使用的标号在其他源文件中定义,但要在当前源文件中引用,而且无论当前源文件是否引用该标号,该标号均会被加入到当前源文件符号表中。
EXTERN:用于通知编译器要使用的标号在其他源文件中定义,但要在当前源文件中引用,如果当前源文件实际并未引用该标号,该标号不会被加入到当前源文件符号表中。