清采NOTE

理解他人 善待自己

用户工具

站点工具


courses:embedded_system:伪操作

1. 符号定义伪操作

操作符 语法格式(例) 功能
声明变量 GBLA GBLA var_a 声明一个全局算术变量并初始化为零
GBLL GBLL var_l 声明一个全局逻辑变量并初始化为逻辑假,即{FALSE}
GBLS GBLS var_s 声明一个全局字符串变量并初始化为空字符串,即“ ”
LCLA LCLA var_a 声明一个局部算术变量并初始化为零
LCLL LCLL var_l 声明一个局部逻辑变量并初始化为逻辑假,即{FALSE}
LCLS LCLS var_s 声明一个局部字符串变量并初始化为空字符串,即“ ”
变量赋值 SETA var_a SETA 0xFF 为一个算术变量赋值
SETL var_l SETL {TRUE} 为一个逻辑变量赋值,{TRUE}或者{FALSE}
SETS var_s SETS “Hello ARM!” 为一个字符串变量赋值
定义别名 RLIST reg_list RLIST {R0-R3, R5} 为一个通用寄存器列表定义名称
CN name CN 6 为一个协处理器的寄存器(编号)定义名称
CP name CP 2 为一个协处理器(编号)定义名称
DN name DN 16 为一个VFP双精度寄存器(编号)定义名称
SN name SN 8 为一个VFP单精度寄存器(编号)定义名称
FN name FN 6 为一个浮点FPA寄存器(编号)定义名称
RN name RN Rx 为一个寄存器定义别名

2. 数据定义伪操作

操作符 语法格式(例) 功能
声明 LTORG LTORG 声明一个数据(文字)缓冲池(literal pool)
定义 MAP MAP 0x10, R9 定义一个结构化的内存表的首地址(此例 = 0x10 + R9)
FIELD {label} FIELD 4 定义结构化的内存表中的一个数据域(此例 = 4字节)
分配 SPACE {label} SPACE 5000 分配一块指定长度(此例 = 5000字节)的内存单元,并用0初始化
DCB string DCB “string”, 0 分配一段连续的字节存储单元,并用伪操作中指定的表达式初始化
DCW {data} DCW 4,5,6 分配一段连续的半字存储单元(半字对齐)
DCWU {data} DCWU 4,5,6 分配一段连续的半字存储单元
DCD {data} DCD 4,5,6 分配一段连续的存储单元(字对齐)
DCDU {data} DCDU 4,5,6 分配一段连续的存储单元
DCDO {data} DCDO label 分配一段连续的存储单元,每个单元初始化为相对SB(R9)的偏移量
DCFD {data} DCD 2E11, -5E7 分配一段连续的双字存储单元(字对齐)
DCFDU {data} DCDU 4,5,6 分配一段连续的双字存储单元
DCQ {data} DCQ -255, 2_101 分配一段连续的双字内存单元,并用64位整数初始化(字对齐)
DCQU {data} DCQU -255, 2_101 分配一段连续的双字内存单元,并用64位整数初始化
DCI {data} DCI 0xE16F0F10 分配用于存放代码的内存单元

3. 杂项伪操作

操作符 语法格式(例) 功能
AREA AREA name, attr 定义一个代码段或者数据段
ALIGN ALIGN number 该指令位置之后number个字节对齐,缺省为4字节(字)对齐
CODEx CODE32/CODE16 告诉汇编器后面指令为ARM/Thumb指令,但并不改变处理器工作状态
END END 通知编译器已经到了源程序的结尾
ENTRY ENTRY 汇编程序的入口
EQU name EQU 2 定义一个常量,类似C语言中的 #define,注意与符号定义伪操作中的“变量”区分
EXPORT EXPORT label 在程序中声明一个全局标号(指向某个指令地址),其他文件中可以引用
GLOBAL GLOBAL label 同 EXPORT
EXPORTAS EXPORTAS b, a 在目标文件中,将源文件中导入的符号b替换为a表示,值不变
IMPORT IMPORT __main 提供未在当前汇编中定义的名称,不管该名称是否在当前汇编中引用
EXTERN EXTERN … 类似 IMPORT,但仅导入当前汇编中引用的名称
GET GET test.s 当前源文件中包含另一个源文件,并编译,类似C语言中的 #include<>
INCLUDE INCLUDE test.s 同 GET
INCBIN INCBIN test.dat 当前源文件中包含另一个其他类型的文件,但不编译
KEEP KEEP label 告诉编译器,将局部符号包含在目标文件的符号表中,在调试器中可见
NOFP NOFP 禁止源程序中包含浮点运算指令
REQUIRE REQUIRE label 指定段之间的相互依赖关系(require)
REQUIRE8 REQUIRE8 {bool} 指示当前文件要求堆栈8字节对齐,通知到链接器,并由链接器检查
PREQUIRE8 PREQUIRE8 {bool} 指示当前文件为堆栈8字节对齐
ROUT {name} ROUT 限制局部标号的作用范围:两个ROUT之间,或ROUT开始之后的整个AREA

4. 汇编控制伪操作

选择

语法格式 IF… ELSE… ENDIF
IF	UART0 = ON
	BL	URAT0_init
ELSE
	BL	URAT1_init
ENDIF

循环

语法格式 WHILE… WEND
	GBLA  count		; 定义一个变量count
count	SETA  1
	WHILE  count <= 4	; 进入循环的条件
count	SETA  count+1
	...			; 此处代码将会重复4次
	WEND