ARM汇编语言小结
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
ARM汇编语言源程序语句,一般由指令,伪操作,宏指令和伪指令作成.
ARM汇编语言的设计基础是汇编伪指令,汇编伪操作和宏指令.
伪操作,是ARM汇编语言程序里的一些特殊的指令助记符,其作用主要是为完成汇编程序做各种准备工作,在源程序运行汇编程序处理,而不是在计算机运行期间有机器执行.也就是说,这些伪操作只是汇编过程中起作用,一旦汇编结束,伪操作的使命也就随之消失.
宏指令,是一段独立的程序代码,可以插在程序中,它通过伪操作来定义,宏在被使用之前必须提前定义好,宏之间可以互相调用,也可自己递归调用.通过直接书写宏名来使用宏.并本具宏指令的格式输入输出参数.宏定义本身不产生代码,只是在调用它时把宏体插入到原程序中.宏与C语言中的子函数形参和实参的调用相似,调用宏时通过实际的指令来 代替宏体实现相关的一段代码,但宏的调用与子程序的调用有本质的区别,既宏并不会节省程序的空间,其优点是简化程序代码,提高程序的可读性以及宏内容可以同步修改.
伪操作,宏指令一般与编译程序有关,因此ARM汇编语言的伪操作,宏指令在不同的编译环境下有不同的编写形式和规则.目前常用的ARM编译环境有2种.
伪指令也是ARM汇编语言程序里的特殊助记符,也不在处理器运行期间由机器执行,他们在汇编时将被合适的机器指令代替成ARM或Thumb指令,从而实现真正的指令操作.
常见的ARM编译环境有2种:
1. ADS/SDT IDE:ARM公司开发,使用了CodeWarrior公司的编译器.
2. 集成了GNU开发工具的IDE开发环境;它由GNU的汇编器as,交叉汇编器gcc和连接器id组成.
ADS编译环境下的ARM伪操作和宏指令:
1. 符号定义伪操作
2. 数据定义伪操作
3. 汇编控制伪操作
4. 框架描述伪操作
5. 信息报告伪操作
6. 其他伪操作
1. 符号定义伪操作,用于定义ARM汇编程序中的变量,对变量进行赋值以及对定义存储器的名称.
1.1 GBLA,GBLS,GBLL
GBLA,GBLL,GBLS伪操作用于声明一个ARM程序中的全局变量,并在默认情况下初始化.
GBLA声明一个全局的算术变量,并将其初始化成0;
GBLL声明一个全局的逻辑变量,并将其初始化为FALSE;
GBLS声明一个全局的字符串变量,并将其初始化为””.
语法:Variable
使用说明:GBLX声明的变量在其作用范围内必须唯一,即同名变量只能在作用范围内出现一次.如果用这些伪操作声明已经声明的变量,则变量的值将被初始化成第2次声明语句中的值.全局变量的作用范围为包含该变量的源程序.
举例:
GBLA arithmetic ;声明一个全局的算术变量.
Arithmetic SETA 0xff; 变量赋值为0XFF
SPACE arithmetic; 使用该变量
GBLL logical ; 声明一个全局的逻辑变量logical
Logical SETL{TRUE}; 变量赋值为True
1.2 LCLA,LCLL,LCLS
LCLA,LCLL,LCLS 伪操作,用于声明一个ARM程序中的局部变量,并在默认情况下初始化.
LCLA声明一个局部的算术变量,并将其初始化成0;
LCLL 声明一个局部的逻辑变量,并将其初始化成{FALSE};
LCLS声明一个局部的字符串变量,并将其初始化成””.
语法 Variable
使用说明: 如果用这些伪操作声明已经声明的变量,则变量的值将被初始化成第2次声明语句中的值.局部变量的作用
范围为包含该局部变量的宏代码的一个实例,即局部变量一般只用在宏代码中.
举例:
MACRO ; 声明一个宏
$label message $a; 宏的原形,宏的名字为message ,有一个参数$a
LCLS string; 声明一个局部变量string
string SETS “error”; 向该变量赋值
$label ;
INFO 0 ,”string”:CC: :STR:$a ; 使用变量
MEND ; 宏定义结束.
1.3 SETA,SETL,SETS
SETA,SETL,SETS伪操作语句为ARM程序中的全局或局部变量的赋值语句
SETA给一个全局或局部算术变量赋值
SETL给一个全局或局部逻辑变量赋值
SETS给一个全局或局部的字符串变量赋值
语法 Vaiable expr
使用说明:在向变量赋值前,必须先声明变量.
举例:
GBLA arithmetic ; 声明算术变量
arithmetic SETA oxEF; 赋值
SPACE arithmetic; 运用算术变量
GBLL logical; 声明逻辑变量
logical SETL{TRUE}; 赋值
1.4 RLIST
RLIST为一个通用寄存器列表定义名称
语法 name RLIST {list of registers}
name 是将要定义的寄存器名称,{list of registers }为通用寄存器列表.
使用说明: RLIST伪操作用于通用寄存器列表定义名称.定义的名称可以在LDM/STM指令中使用,即这个名字代表了一个通用寄存器列表,在LDM/STM指令中,寄存器列表中的寄存器的访问次序,总是先访问编号较底的寄存器,再访问编号教高的寄存器.也可以说,是编号低的寄存器对应于寄存器的低地址,而不管寄存器列表中寄存器的排列顺序.但为了编程的统一性,寄存器列表中各个寄存器一般按编号由低到高排列.
举例:
List RLIST {R0-R3}; 将寄存器R0-R3列表的名字定义为List;
STMDF SP! List; 保存寄存器列表List;
1.5 CN
CN为一个协处理器的寄存器定义名称.
语法 name CN expr
其中name 为协处理器的寄存器的名称,expr为数值范围为0-15
举例:
Power CN 6; 将协处理器的寄存器6的名字定义为Power
1.6CP
CP为一个协处理定义名字
语法 name CP expr
其中name 为协处理器的名称,expr为数值范围为0-15
举例:
Dzx CP 6; 将协处理器6的名字定义为Dzx
1.7 DN,SN
DN 为一个双精度的VFP寄存器定义名称.
SN为一个单精度的VFP寄存器定义名称.
语法:
name DN expr
name SN expr
其中name 为将要定义的VFP寄存器的名称.expr为VFP双精度寄存器编号(0~15)或者单精度寄存器的编号(0~31).
使用说明:
DN,SN伪操作用于给一个VFP寄存器定义名称,方便程序员记忆该寄存器的功能,所以以该寄存器取的名称一般与该寄存器的功能有关.
举例:
height DN 6; 将VFP双精度寄存器6名称定义为height
width SN 20;将VFP单精度寄存器20名称定义为width
1.8 FN
FN为一个FPA浮点寄存器的名称.expr为
浮点寄存器的编号,数值为0~7.
使用说明:
FN伪操作用于给一个FPA浮点寄存器定义名称,方便程序员记忆该寄存器的功能,所以以该寄存器取的名称一般与该寄存器的功能有关.
举例:
Length FN 6; 将FPA浮点寄存器的名称定义为Length
文章评论(0条评论)
登录后参与讨论