arm汇编伪指令
1、 在ARM汇编语言源程序中有些特殊助记符,它们没有相对应的操作码或者机器码,通常称为伪指令。
伪指令在源程序中的作用是为完成汇编程序作各种准备工作的,这些伪指令仅在汇编过程中起作用,一旦汇编结束,伪指令的使命就完成。在ARM汇编程序中,有如下几种伪指令:符号定义伪指令,数据定义伪指令,汇编控制伪指令,信息报告伪指令,宏指令以及其他伪指令
2、 符号定义伪指令,用于定义ARM汇编程序中的变量、对变量赋值以及定义寄存器的别名等操作。
常见的符号定义伪指令有如下几种(A表示data,L:logic,S:string):
定义局部变量的LCLA、LCLL、LCLS;(局部变量作用范围为当前段)
定义全局变量的GBLA、GBLL、GBLS;
对变量赋值的SETA、SETL、SETS;
为通用寄存器列表定义名称的RLIST。
例如:
GBLA Test1 ;定义一个全局的数字变量,变量名为Test1
Test1 SETA 0xAA ;将该变量赋值为0xAA
GBLL Test2 ;定义一个全局的逻辑变量,变量名为Test2
Test2 SETL {TRUE} ;将该变量赋值为真
GBLS Test3 ;定义一个全局的字符串变量,变量名为Test3
Test3 SETS “Testing” ;将该变量赋值为”Testing”
3、 数据定义伪指令:用于为数据分配存储单元,同时也可完成已分配存储单元的初始化
a) DCB:
语法:标号 DCB 表达式
说明:DCB用于分配一片连续的字节存储单元并用伪指令中指定的表达式进行初始化。其中,表达式可以为使用双引号的字符串或0~255的数字,DCB可用“=”代替。内存分配字节数由表达式决定。
例如: Str DCB “This is a test!”;分配一片连续的字节存储单元并初始化
b) DCD/DCDU:
语法:标号 DCD/DCDU 表达式
说明:DCD伪指令用于分配一片连续的字存储单元并用伪指令中指定的表达式初始化,它定义的存储空间是字对齐的。DCD也可用“&”代替。表达式可以为常量表达式或程序中的地址标号。DCDU功能跟DCD类似,只是分配的存储单元不严格字对齐。
例如: DataTest DCD 4,5,64
c) SPACE:
语法:标号 SPACE 表达式
说明:SPACE用于分配一片连续的存储区域并初始化为0,表达式为要分配的字节数,SPACE也可用“%”代替
例如: Data Space SPACE 100 ;分配连续100字节的存储单元并初始化为0
d) MAP:
语法:MAP 表达式 [,基址寄存器]
说明:MAP定义一个结构化的内存表的首地址,“^”可以用来代替MAP。
表达式可以为程序中的标号或数学表达式,基址寄存器为可选项,当基址寄存器选项不存在时,表达式的值即为内存表的首地址,当该选项存在时,内存表的首地址为表达式的值与基址寄存器的和。MAP伪指令通常与FIELD伪指令配合使用来定义结构化的内存表。
e) FILED:
语法:标号 FIELD 字节数
说明:FIELD用于定义一个结构化内存表中的数据域,“#”可用来代替FILED。
注意:MAP和FILED仅用于定义数据结构,并不实际分配存储单元。FIELD伪指令常与MAP伪指令配合使用来定义结构化的内存表。MAP伪指令定义内存表的首地址,FIELD伪指令定义内存表中的各个数据域,并可以为每个数据域指定一个标号供其他的指令引用。
使用示例:
MAP 0x30000000 ;定义结构化内存表首地址的值为0x30000000
A FIELD 4 ;定义数据域A,长度为4字节,位置为0x30000000
B FIELD 4 ;定义数据域B,长度为4字节,位置为0x30000004
C FIELD 4 ;定义数据域C,长度为4字节,位置为0x30000008
。。。
LDR R1, A ;将0x30000000地址内容加载到R1
STR R2, B ;将R2的值存储到地址为0x30000004内存单元
f)
4、 汇编控制伪指令:汇编控制伪操作用于控制汇编程序的执行流程
a) MACRO、MEND(宏定义)
MACRO
[$标号] 宏名 [$参数1,$参数2,……]
指令序列
MEND
在源程序被编译时,汇编器将宏调用展开,用宏定义中的指令序列替换程序中的宏调用,并将实际参数的值传递给宏定义中的参数。
注意:宏操作可以嵌套使用,并可以在编译时用选项加以控制。
b) IF、ELSE、ENDIF(条件语句)
IF 逻辑表达式
代码段1
ELSE
代码段2
ENDIF
IF、ELSE、ENDIF可以分别用“[”、“|”、“]”代替。IF、ELSE、ENDIF伪指令可以嵌套使用。
c) WHILE、WEND:
WHILE 逻辑表达式
指令序列
WEND
d) MEXIT:
MEXIT
说明:MEXIT用于从宏中退出。
5、 其他伪指令:
a) ALIGN
语法:ALIGN [表达式 [,偏移量]]
说明:ALIGN伪操作可以通过填充字节使当前的位置满足一定的对齐方式。其中,表达式的值为2的幂,如1、2、4、8、16等,用于指定对齐方式。
例如:
AREA Init, CODE, READONLY, ALIGN=3; 指定后面的指令为8字节对齐。
b) AREA
语法:AREA段名属性,……
说明:AREA用于定义一个代码段、数据段或者特定属性的段。属性部分表示该代码段/数据段的相关属性,多个属性可以用逗号“,”分隔。
c) CODE16/CODE32
说明:CODE16伪操作指示编译器后面的代码为16位的Thumb指令。CODE32伪操作指示编译器后面的代码为32位的ARM指令。
在使用ARM指令和Thumb指令混合编程的代码里,可用这两条伪指令进行切换,但注意它们只通知编译器其后指令的类型,并不能对处理器进行状态的切换(涉及ARM状态的切换需使用BX指令)。
d) ENTRY
说明:ENTRY用于指定汇编程序的入口。在一个完整的汇编程序中至少要有一个ENTRY,程序中也可以有多个,此时,程序的真正入口点可在链接时指定,但在一个源文件里最多只能有一个ENTRY或者没有ENTRY。
e) EQU
语法:名称 EQU 表达式[,类型]
说明:EQU用于将程序中的数字常量、标号、基于寄存器的值赋予一个等效的名称,这一点类似于C语言中的#define,可用“*”代替EQU。
如果表达式为32位的常量,我们可以指定表达式的数据类型,类型域可以有以下三种:CODE16/CODE32/DATA
例如:NUM EQU 100 ;定义标号NUM值为100
Addr EQU 0xAA, CODE32 ;定义Addr的值为0xAA,且该处为32位的ARM指令
f) EXPORT
语法:EXPORT 标号
说明:EXPORT 在程序中声明一个全局标号,该标号可以在其他的文件中引用。用户也可以用GLOBAL代替EXPORT。标号在程序区分大小写。
g) IMPORT
语法:IMPORT 标号
说明:IMPORT告诉编译器这个标号要在当前源文件中使用,但标号是在其他的源文件中定义的。不管当前源文件是否使用过该标号,这个标号都会加入到当前源文件的符号表中。标号在程序中区分大小写。
例如:
AREA Init,CODE,READONLY
IMPORT Main ;通知编译器当前文件要引用标号Main,但是Main在其他源文件中定义。
h)
6、