- AREA伪指令
此伪指令用于给一段汇编代码或数据段起一个名字.一个完整的汇编程序至少要有一个以上的代码段,其语法格式为
AREA 段名属性1,属性2,....
例: AREA init CODE,READONLY 定义了段名为init的属性为只读的代码.
其用意主要是当代码比较长时,可以根据功能来划分代码段,增加程序的可读性.所以段名的命名要符合该程序段的功能,换句话说也就是让人一看段名就知道该程序段是干什么用的.
2. EQU伪指令
EQU(equal 相等的意思,EUQ两边具有等价关系,通俗的说就是给一个表达式,为什么要给表达式名字,一是表达式太长了不好记忆,二是该表达式用得比较多,方便修改.想当与C语言里的符号常量.语法格式:
名字 EQU 表达式 ;表达式可以是常量
例: Number EQU 50
实际上我们在ARM里用得比较多的是:
GPFCON EUQ 0x56000050
因为寄存器名和其对应的地址都是系统设计好了的.所以在这里几是想当与将寄存器名和它对应的地址之间的关系建立起来.这样就可以直接通过寄存器名来访问该寄存器了.
3 EXPORT伪指令
在程序里我们常常要定义很多标号,但那些标号只能在本文件中使用,通常一个工程包含很多个文件,要想在别的文件中使用该文件定义的标号就必须使用EXPORT伪指令.含义就是定义一个全局标号,语法格式:
EXPORT 标号
例: EXPORT LOOP1
4 IMPORT伪指令
语法格式为:
IMPORT 标号
起含义通知编译器此标号在别的文件定义,但在此文件中要使用.一个比较常用的用法是在汇编语言调用C函数时:
AREA Init,CODE,READONLY
IMPORT Main ;通知编译器当前文件要引用标号Main,但Main在其他源文件中定义
镲
END
5 GET伪指令
相当C语言的INCLUDE指令,语法格式为:
GET 文件名
例:GET a1.s ;通知编译器源文件a1.s被包含当前源文件.
作用用于将一个源文件包含到当前的源文件中,并将被包含的源文件在当前位置进行汇编处理,但注意GET伪指令只能用于包含源文件,包含目标文件需要使用INCBIN.
伪指令
6 INCBIN
INCBIN伪指令用于将一个目标文件或数据文件包含到当前的源文件中,被包含的文件不作任何变动的存放在当前文件中,编译器从其后开始继续处理
语法格式:
INCBIN 文件名
INCBIN a1.dat ;通知编译器当前源文件包含文件a1.dat
7CODE16、CODE32
语法格式:
CODE16(或CODE32)
CODE16伪指令通知编译器,其后的指令序列为16位的Thumb指令。
CODE32伪指令通知编译器,其后的指令序列为32位的ARM指令.
若在汇编源程序中同时包含ARM指令和Thumb指令时,可用CODE16伪指令通知编译器其后的指令序列为16位的Thumb指令,CODE32伪指令通知编译器其后的指令序列为32位的ARM指令。因此,在使用ARM指令和Thumb指令混合编程的代码里,可用这两条伪指令进行切换,但注意他们只通知编译器其后指令的类型,并不能对处理器进行状态的切换
<二> 符号定义(Symbol Definition)伪指令
1 GBLA、GBLL和GBLS 全局变量定义伪指令 GB(global)
GBLA、GBLL和GBLS伪指令用于定义一个ARM程序中的全局变量,并将其初始化,GALA初始化为0,GBLL,初始化为F(假),GBLS初始化为空
语法格式:
GBLA(GBLL或GBLS) 变量名
2 LCLA、LCLL和LCLS 局部变量定义伪指令 LC(local)
LCLA、LCLL和LCLS伪指令用于定义一个ARM程序中的局部变量,并将其初始化,初始值同全局变量.语法格式同全局变量.
3 SETA、SETL和SETS 变量赋值伪指令
伪指令SETA、SETL、SETS用于给一个已经定义好的数字变量、逻辑变量、字符串变量赋值,变量可以是全局变量或局部变量.语法格式
变量名 SETA(SETL或SETS) 值
LCLA NUM
NUM SETA 0xff
LCLL Test4 ;声明一个局部的逻辑变量,变量名为Test4
Test4 SETL {TRUE} ;将该变量赋值为
(三)汇编控制(Assembly Control)伪指令
1 IF、ELSE、ENDIF
语法格式:
IF 逻辑表达式
指令序列1
ELSE
指令序列2
ENDIF
IF、ELSE、ENDIF伪指令能根据条件的成立与否决定是否执行某个指令序列。当IF后面的逻辑表达式为真,则执行指令序列1,否则执行指令序列2。其中,ELSE及指令序列2可以没有,此时,当IF后面的逻辑表达式为真,则执行指令序列1,否则继续执行后面的指令.
例:
GBLL Test ;声明一个全局的逻辑变量,变量名为Test
镲
IF Test = TRUE
指令序列1
ELSE
指令序列2
ENDIF
2、 WHILE、WEND
语法格式:
WHILE 逻辑表达式
指令序列
WEND
WHILE、WEND伪指令能根据条件的成立与否决定是否循环执行某个指令序列。当WHILE后面的逻辑表达式为真,则执行指令序列,该指令序列执行完毕后,再判断逻辑表达式的值,若为真则继续执行,一直到逻辑表达式的值为假。
使用示例:
GBLA Counter ;声明一个全局的数学变量,变量名为Counter
Counter SETA 3 ;由变量Counter控制循环次数
镲
WHILE Counter < 10
指令序列
WEND
3 MACRO、MEND
语法格式:
MACRO
$标号 宏名 $参数1,$参数2,镲
指令序列
MEND
(四)数据定义(Data Definition)伪指令
数据定义伪指令一般用于为特定的数据分配存储单元,同时可完成已分配存储单元的初始化。常见的数据定义伪指令有如下几种:
— DCB 用于分配一片连续的字节存储单元并用指定的数据初始化。
— DCW(DCWU)用于分配一片连续的半字存储单元并用指定的数据初始化。
— DCD(DCDU)用于分配一片连续的字存储单元并用指定的数据初始化。
— DCFD(DCFDU)用于为双精度的浮点数分配一片连续的字存储单元并用指定的数据初始化。
1 DCB ;B(byte)字节
语法格式:
标号 DCB 表达式
DCB伪指令用于分配一片连续的字节存储单元并用伪指令中指定的表达式初始化。其中,表达式可以为0~255的数字或字符串。DCB也可用“=”代替
例:
Str DCB “This is a test!” ;分配一片连续的字节存储单元并初始化
2、 DCW(或DCWU)
语法格式:
标号 DCW(或DCWU) 表达式
DCW(或DCWU)伪指令用于分配一片连续的半字存储单元并用伪指令中指定的表达式初始化。其中,表达式可以为程序标号或数字表达式。。
用DCW分配的字存储单元是半字对齐的,而用DCWU分配的字存储单元并不严格半字对齐
例:
DataTest DCW 1,2,3 ;分配一片连续的半字存储单元并初始化。
3 DCD(或DCDU) ;加U表示不严格字对齐
语法格式:
标号 DCD(或DCDU) 表达式
DCD(或DCDU)伪指令用于分配一片连续的字存储单元并用伪指令中指定的表达式初始化。其中,表达式可以为程序标号或数字表达式。DCD也可用“&”代替。
例:
DataTest DCD 4,5,6 ;分配一片连续的字存储单元并初始
4 DCFD(或DCFDU) F(float)D(double) 双精度浮点数.
语法格式:
标号 DCFD(或DCFDU) 表达式
DCFD(或DCFDU)伪指令用于为双精度的浮点数分配一片连续的字存储单元并用伪指令中指定的表达式初始化。每个双精度的浮点数占据两个字单元。
例:
FDataTest DCFD 2E115,-5E7 ;分配一片连续的字存储单元并初始化为指定的双精度数
5 DCFS(或DCFSU) S(single)D(double) 单精度浮点数
语法格式:
标号 DCFS(或DCFSU) 表达式
DCFS(或DCFSU)伪指令用于为单精度的浮点数分配一片连续的字存储单元并用伪指令中指定的表达式初始化。每个单精度的浮点数占据一个字单元.
例:
FDataTest DCFS 2E5,-5E-7 ;分配一片连续的字存储单元并初始化为指定的单精度数。