在C语言中,为了编程方便,编译器会定义一系列与处理命令,并用#来标识,如#include,#define,#if,#else,#end等。这些预处理命令并不是真正的C语言关键字,而是为了编程方便,编译器提供给我们的使用的预定义标识符。一个C程序经过预处理后,这些预处理命令一般会全部消失,预处理后的代码变成了一个完全由C语言关键字和标准语法构成的原汁原味的C程序,然后编译器才能对这些源程序进行语法,语义分析,最后变异成二进制可执行文件,在整个编译过程中,编译器是不认识这些预处理命令的,如果编译之前不坐处理,则编译器就会报错。
同理,汇编中,为了编程方便,也有助记符,方便对汇编程序做各种处理,如使用AREA来定义一个段section, 使用GBLA来定义一个数据,使用ENTRY来制定汇编程序入口,这些指令助记符统称为伪指令或者伪操作。伪操作是为便携汇编程序服务的,即使在同一个CPU架构下,不同的编译环境或者汇编器虽然会遵循和兼容同一套指令集,但是可能定义不同的伪指令,使用的方法和格式也不同。
伪指令一般用于符号定义,数据定义,汇编程序结构控制等场合,在一个汇编中经常使用的伪指令如下。
GBLA a;定一个一个全局算数变量a,并初始化为0
a SETA 10 给算数变量a 设置为10
GBLL b 定义一个全局逻辑变量b,并出实话位0
b SETL 20 b = 20
GBLS STR 定义一个全局字符串,str,初始化位0
STR SETS "higosasdaf" 将字符串赋值
LCLA a 定义一个全局算术变量a, 并初始化位0
LCLL b 定义一个局部逻辑变量b,并初始化位false
LCLS name 定义一个局部字符串变量,并初始化位0
name SETS "xsanp" 给局部字符串变量赋值
关于数据定义,常用的伪指令又DCD,DCB,SPACE,DATA 这些伪指令的使用方法如下
DATA1 DCB 10,20,30,40
STR DCB "higosasdaf"
DATA2 DCD 10,20,30,40
BUF SPACE 100
除此之外,还有一些常用的伪指令操作,如用来表示程序的入口地址,程序的结束地址,用来定义段的属性等。
伪操作 | 说明 |
ALIGN | 地址对齐 |
AREA | 用来定义一个代码段或者数据段,常用的段属性位CODE/DATA |
CODE16/CODE32 | 指令为THUMB或者ARM |
ENTRY | 程序入口 |
END | 程序结束,停止编译 |
EQU | 赋值伪指令,类似宏,给常量定义一个符号 |
EXPORT/GLOBAL | 声明一个全局符号,可以被其它文件引用 |
IMPORT /EXTERN | 引用其它文件的符号 |
GET/INCLUDE | 包含文件,并在当前位置编译该文件,一般是程序文件 |
INCBIN | 包含文件,一般是数据文件 |