工学ARM教材ARM汇编程序设计文档格式.docx
《工学ARM教材ARM汇编程序设计文档格式.docx》由会员分享,可在线阅读,更多相关《工学ARM教材ARM汇编程序设计文档格式.docx(21页珍藏版)》请在冰豆网上搜索。
●用于对变量赋值的SETA、SETL、SETS;
●为通用寄存器列表定义名称的RLIST;
●为一个协处理器的寄存器定义名称的伪指令CN;
●为一个协处理器定义名称的伪指令CP;
●为一个CFP寄存器定义名称的伪指令DN和SN;
●为一个FPA浮点寄存器定义名称的伪指令FN。
1.GBLA、GBLL和GBLS
语法格式:
GBLA(GBLL或GBLS)全局变量名
GBLA、GBLL和GBLS伪指令用于定义一个ARM程序中的全局变量,并半其初始化。
其中:
GBLA伪指令用于定义一个全局的数字变量,并初始化为0;
GBLL伪指令用于定义一个全局的逻辑变量,并初始化为F(假);
GBLS伪指令用于定义一个全局的字符串变量,并初始化为空。
由于以上三条伪指令用于定义全局变量,因此在整个程序范围内变量名必须唯一。
使用示例:
GBLANumber1;
定义一个全局的数字变量,变量名为Number1
Number1SETA0xaa;
将Number1变量赋值为0xaa
GBLLTrue1;
定义一个全局的逻辑变量,变量名为True1
True1SETL{TRUE};
将True1变量赋值为真
GBLSString1;
定义一个全局的字符串变量,变量名为String1
String1SETS“Testing”;
将String1变量赋值为“Testing”
2.LCLA、LCLL和LCLS
LCLA(LCLL或LCLS)局部变量名
LCLA、LCLL和LCLS伪指令用于定义一个ARM程序中的局部变量,并将其初始化,其中:
●LCLA伪指令用于定义一个局部的数字变量,并初始化为0;
●LCLL伪指令用于定义一个局部的逻辑变量,并初始化为F(假);
●LCLS伪指令用于定义一个局部的字符串变量,并初始化为空。
以上三条伪指令用于声明局部变量,在其作用范围内变量名必须唯一。
LCLANumber2;
声明一个局部的数字变量,变量名为Number2
Number2SETA0xaa;
将Number2变量赋值为0xaa
LCLLLogic2;
声明一个局部的逻辑变量,变量名为Logic2
Logic2SETL{TRUE};
将Logic2变量赋值为真
LCLSString2;
定义一个局部的字符串变量,变量名为String2
String2SETS“Testing”;
将String2变量赋值为“Testing”
3.SETA、SETL和SETS
变量名SETA(SETL或SETS)表达式
伪指令SETA、SETL、SETS用于给一个已经定义的全局变量或局部变量赋值。
●SETA伪指令用于给一个数学变量赋值;
●SETL伪指令用于给一个逻辑变量赋值;
●SETS伪指令用于给一个字符串变量赋值。
其中,变量名是已经定义地的全局变量或局部变量,表达式是将要赋给变量的值。
LCLANumber3;
声明一个局部的数字变量,变量名为Number3
Number3SETA0xaa;
将Number3变量赋值为0xaa
LCLLLogic3;
声明一个局部的逻辑变量,变量名为Logic3
Logic3SETL{TRUE}了;
将Logic3变量赋值为真
4.RLIST
名称RLIST{寄存器列表}
RLIST伪指令可用于对一个通用寄存器列表定义名称,使用该伪指令定义的名称可在ARM指令LDM/STM中使用。
在LDM/STM指令中,列表中的寄存器访问次序为根据寄存器的编号由低到高,而与列表中的寄存器排列次序无关。
RegListRLIST{R0-R5,R8,R10};
将寄存器列表名称定义为RegList,可在ARM
;
指令LDM/STM中通过该名称访问寄存器列表
STMDSP!
RegList;
保存寄存器列表RegList到堆栈
由于在编程过程中,协处理器汇编伪指令使用的情况比较少,因此本书不对CP、DN和SN以及FN等协处理器伪指令进行介绍。
4.1.2数据定义(DATADefinition)伪指令
数据定义伪指令一般用于为特定的数据分配存储单元,同时可完成对已分配存储单元的初始化。
常见的数据定义伪指令有如下几种:
●DCB用于分配一片连续的字节存储单元并用指定的数据初始化;
●DCW(DCWU)用于分配一片连续的半字节存储单元并用指定的数据初始化;
●DCD(DCDU)用于分配一片连续的字存储单元并用指定的数据初始化;
●DCFS(DCFSU)用于为双精度的浮点数分配一片连续的字存储单元并用指定的数据初始化;
●DCQ(DCQU)用于分配一片以8字节个为单位的连续的存储单元并用指定的数据初始化;
●DCDO用于分配一段字的内存单元,将每个单元的内容初始化为该单元相对于基址寄存器的偏移量;
●DCI用于分配一段字的内丰单元,并用单精度的浮点数据初始化,指定内存单元存放的是代码,而不是数据;
●SPACE用于分配一片连续的存储单元;
●MAP用于定义一个结构化的内存表首地址;
●FIELD用于定义一个结构化的内在表的数据域;
●LTORG用于声明一个文字池。
1.语法格式:
标号DCB表达式
DCB伪指令用于分配一片连续的字节存储单元并用伪指令中的表达式初始化。
其中,表达式可以为0—255的数字或字符吕,DC也可用“=”代替。
DCB伪指令用于分配一片连续的字节存储单元并用伪指令中指定的表达式初始化。
其中,表达式可以为0—255的数字或字符串,DCB也可用“=”代替。
StringDCB“Thisisatest!
”;
分配一片连续的字节存储单元并初始化
ParameterDCB0x33,0x44,0x55
DCB-1,-2,0,1,2,;
2.DCW(或DCWU)
标号DCW(或DCWU)表达式
DCW(或DCWU)伪指令用于为双精度的浮点数分配一片连续的字节存储单元,并用伪指令中指定的表达式初始化。
每个双精度的浮点数占据两个字单元,用DCFD分配的字存储单元是字对齐的,而用DCFDU分配的字存储单元并不严格字对齐。
FdataDCFD0,2E115。
-5E7;
分配一片连续的字存储单元并初始化为指定的双精度数
5.DCFS(或DCFSU)
标号DCFS(或DCFSU)表达式
DCFS(或DCFSU)伪指令用于为单精度的浮点数分配一片连续的字存储单元,并用伪指令中指定的表达式初始化。
每个单精度的浮点数占据一个字单元,用DCFS分配的字存储单元是字对齐的,而用DCFSU分配的字存储单元并不严格对齐。
SdataDCFS1,2E5,-5E7;
分配一片连续的字存储单元并初始化为指定的单精度数
6.DCQ(或DCQU)
标号DCQ(或DCQU)表达式
DCQ(或DCQU)伪指令用于分配一片以8个字节为单位的连续存储区域,并用伪指令中指定的表达式初始化。
用DCQ分配的存储单元是字对齐的,而用DCQU分配的存储单元并不严格对齐。
DataDCQ100,1000;
分配一片连续的存储单元并初始化为指定的值
7.DCDO
标号DCDO表达式
DCDO用于分配一段字内存单元,并将每个单元的内容初始化为该单元相对于表态基址寄存器的偏移量。
DCDO伪指令作为表态基址寄存器R9的偏移量分配内在单元,该指令需要内在字对齐。
IMPORTexternsys
DataDCDOexternnsys;
分配32位的字单元,其值勤为标号externnsys基于R9的偏移量
8.DCI
标号DCI表达式
DCI用于分配一段字节的内在单元,并用伪指令中指定的表达式初始化。
指定内在单元存放的是代码而不是数据,在Thumb代码中,DCI分配的是半字节的内存代码单元。
MACRO;
这个宏指令将指令newinstrRd,Rm定义为相应的机器指令
Newinstr$Rd,$Rm
DCI0Xe15f0f10:
CR:
(8$Rd:
SHL:
12):
OR;
$Rm;
这是存放的是指令MEND
9.SPACE
标号SPACE表达式
SPACE伪指令用于分配一片连续的存储区域并初始化为0。
其中,表达式是要分配的字节数,SPACE也可用“%”代替。
DataSpaceSPACE1000;
分配连续1000B的存储单元并初始化为0
10.MAP
MAP表达式{,基址寄存器}
MAP伪指令用于定义一个结构化的内存表的首地址,MAP也可用“^”代替。
表达式可以是程序中的标号或数学表达式,基址寄存器为可选项,当基址寄存器选项不存在时,表达式的值即为内存表的首地址,当该选项存在时,内存表的首地址为表达式的值与基址寄存器的和。
MAP伪指令通常与FIELD伪指令配合使用来定义结构化的内存表。
MAP0x10,R0;
定义结构化内存表首地址的值为0x10+R0
11.FIELD
标号FIELD表达式
FIELD伪指令用于定义一个结构化内存表中的数据域。
FIELD也可用“#”代替,表达式的值是当前数据域在内存表中所占的字节数。
FIELD伪指令常与MAP伪指令配合使用来定义结构化的内存表,MAP伪指令定义内存表的首地址,FIELD伪指令定义内存表中的各个数据域,并可以为每个数据域指定一个标号供其他的指令引用。
注意MAP和FIELD伪指令仅用于定义数据结构,并不实际分配存储单元。
MAP0x100;
定义结构化内存表首地址的值为为0x100
AFIELD16;
定义A的长度为16B,位置为0x100
BFIELD32;
定义B的长度为32B,位置为0x110(0x100的存放了
16个字节