伪指令
在ARM汇编语言源程序中有些特殊助记符,它们没有相对应的操作码或者机器码,通常称为伪指令,它们所完成的操作称为伪操作。
伪指令在源程序中的作用是为完成汇编程序作各种准备工作的,由汇编程序在源程序的汇编期间进行处理,仅在汇编过程中起作用。
在ARM的汇编程序中,有如下几种伪指令:
符号定义伪指令
数据定义伪指令
汇编控制伪指令
信息报告伪指令
宏指令以及其他伪指令
符号定义伪指令
作用:用于定义ARM汇编程序中的变量、对变量赋值以及定义寄存器的别名等。
符号定义有如下几种伪指令:
用于定义局部变量的LCLA、LCLL和LCLS。
用于定义全局变量的GBLA、GBLL和GBLS。
用于对变量赋值的SETA、SETL和SETS。
为通用寄存器列表定义名称的RLIST。
数据定义伪指令
作用:为数据分配存储单元,同时初始化。
有如下几种:
DCB 字节分配
DCW/DCWU 半字(2字节)分配
DCD/DCDU 字(4字节)分配
DCQ/DCQU 8个字节分配
DCFS/DCFSU 单精度浮点数分配
DCFD/DCFDU 双精度浮点数分配
SPACE 分配一块连续的存储单元
FIELD 定义一个结构化的内存表的数据域
MAP 定义一个结构化的内存表首地址
汇编控制伪指令
作用:指引汇编程序的执行流程。
常用的伪操作包括:
(1)MACRO和MEND:宏定义的开始与结束。
(2)IF、ELSE和ENDIF:根据逻辑表达式的成立与否决定是否在编译时加入某个指令序列。
(3)WHILE和WEND:根据逻辑表达式的成立与否决定是否循环执行这个代码段。
(4)MEXIT:从宏中退出。
宏定义伪指令
程序中调用该宏exam jump sub,det ;调用宏jump,宏的标号为exam, 参数1为sub,参数2为det
程序被汇编后,宏的展开结果:
…
examloop1
…
BGE examloop1
examloop2
BL sub
BGT examloop2
ADR det
IF、ELSE和ENDIF
格式:
IF 逻辑表达式
代码段1
ELSE
代码段2
ENDIF
说明:能根据逻辑表达式的成立与否决定是否在编译时加入某个指令序列。 IF、ELSE和ENDIF分别可以用“[”,“|”,“]”代替。如果IF后面的逻辑表达式为真,则编译代码段1,否则编译代码段2。ELSE及代码段2也可以没有,这时,当IF后面的逻辑表达式为真时,则代码段1,否则继续编译后面的指令。