ARM汇编程序设计之:ARM汇编器所支持的伪操作
2.局部变量定义伪操作LCLA、LCLL和LCLS
(1)语法格式
LCLA、LCLL和LCLS伪指令用于定义一个ARM程序中的局部变量并将其初始化。其中:
LCLA伪操作用于定义一个局部的数字变量并初始化为0。
LCLL伪操作用于定义一个局部的逻辑变量并初始化为F(假)。
LCLS伪操作用于定义一个局部的字符串变量并初始化为空。
以上三条伪操作用于声明局部变量,在其作用范围内变量名必须惟一。
语法格式如下。
lclx>variable>
①gblx>
取值为LCLA、LCLL、LCLS之一。
②variable>
所定义的局部变量名,在其作用范围内必须惟一。局部变量作用范围为包含该局部变量的宏。
(2)使用说明
如果用这些伪操作重新声明已经声明过的变量,则变量的值将被初始化成后一次声明语句中的值。
(3)示例
①使用伪操作声明局部变量。
LCLATest4 ;声明一个局部的数字变量,变量名为Test4
Test3SETA0xaa ;将该变量赋值为0xaa
LCLLTest5 ;声明一个局部的逻辑变量,变量名为Test5
Test4SETL{TRUE} ;将该变量赋值为真
LCLSTest6 ;定义一个局部的字符串变量,变量名为Test6
Test6SETSTesting ;将该变量赋值为“Testing”
②下面的例子定义一个宏,显示了局部变量的作用范围。
MACRO ;声明一个宏
$labelmessage$a ;宏原型
LCLSerr ;声明局部字符串变量
$label
INFO0,err:CC::STR:$a
MEND ;宏结束,局部变量不再起作用
3.变量赋值伪操作SETA、SETL和SETS
(1)语法格式
伪指令SETA、SETL和SETS用于给一个已经定义的全局变量或局部变量赋值。
SETA伪操作用于给一个数学变量赋值;
SETL伪操作用于给一个逻辑变量赋值;
SETS伪操作用于给一个字符串变量赋值;
语法格式如下。
Variablesetx>expr
①Variable
变量名为已经定义过的全局变量或局部变量,表达式为将要赋给变量的值。
②setx>
取值为SETA、SETL、SETS之一。
③expr
数学、逻辑或字符串表达式,也就是将要赋予变量的值。
(2)使用说明
在向变量赋值前必须先声明变量。
也可以在汇编指令中预定义变量,如:
Armasm--pdobjectsizeSETAoxff--oobjectfilesourcefile
(3)示例
①为预先定义的变量赋值。
LCLATest3 ;声明一个局部的数字变量,变量名为Test3
Test3SETA0xaa ;将该变量赋值为0xaa
LCLLTest4 ;声明一个局部的逻辑变量,变量名为Test4
Test4SETL{TRUE} ;将该变量赋值为真
LCLSTest6 ;定义一个局部的字符串变量,变量名为Test6
Test6SETSTesting ;将该变量赋值为“Testing”
②使用变量赋值伪操作,定义一些程序相关内容。
GBLAversionNumber
VersionNumber SETA21
GBLLDebug
Debug SETL{TRUE}
GBLS versionString
VersionString SETSversion1.0
4.通用寄存器列表定义伪操作RLIST
(1)语法格式
RLIST伪操作可用于对一个通用寄存器列表定义名称,使用该伪操作定义的名称可在ARM指令LDM/STM中使用。在LDM/STM指令中,列表中的寄存器访问次序根据寄存器的编号由低到高,与列表中的寄存器排列次序无关。
语法格式如下。
NameRLIST{list-of-registers}
①Name
寄存器列表的名称。
注意 | 该名称不能和已经定义寄存器或协处理器名称相同。 |
②list-of-registers
通用寄存器列表。列表中的寄存器用“,”隔开,如果是编号连续的通用寄存器可以用“-”指定寄存器范围。具体用法参见程序示例。
(2)使用说明
在使用ARM汇编编译器编译源文件时,可以使用“-checkreg”选项来指定汇编器进行寄存器检查。如果汇编器检测到寄存器列表中的寄存器编号非升序排列,将给出编译警告。
(3)示例
①将寄存器列表名称定义为RegList,可在ARM指令LDM/STM中通过该名称访问寄存器列表。
RegListRLIST{R0-R5,R8,R10};
②使用“-”在寄存器列表中,指定寄存器范围。
ContextRLIST{r0-r6,r8,r10-r12,r15} ;
评论