文档介绍:1
§ ARM汇编语言程序设计
2
本节的主要内容:
预定义的寄存器和协处理器名
ARM编译器所支持的伪指令
汇编语言的语句格式
汇编语言的程序结构
相关的程序示例
3
2. 5. 1 预定义的寄存器和协处理器名
ARM汇编器对ARM的寄存器进行了预定义,所有的寄存器和协处理器名都是大小写敏感的。预定义的寄存器如下:
fp和FP(帧指针,r11);
ip和IP(过程调用中间临时寄存器,r12);
sp和SP(堆栈指针,r13);
lr和LR(链接寄存器,r14);
pc和PC(程序计数器,r15)。
R0~R15和r0~r15;
a1~a4 (参数、结果或临时寄存器,与r0一r3同义);
v1一v8 (变量寄存器,r4~r11);
sb和SB (静态基址,r9);
sl和SL (堆栈限制,r10);
在Thumb状态下通用寄存器只有R0~R7,所以只有v1~v4能使用;
R12~R15一般有特殊用途,通常也被称为IP、SP、LR和PC。
4
cpsr和CPSR;
spsr和SPSR。
f0~f7和F0~F7(FPA寄存器);
s0~s31和S0~S31(VFP单精度寄存器);
d0~d15和D0~D15(VFP双精度寄存器)。
p0~p15(协处理器0~15);
c0~c15(协处理器寄存器0~15)。
5
ARM汇编器所支持的伪指令
在ARM汇编语言程序里,有一些特殊指令助记符,这些助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊指令助记符为伪指令;
伪指令所完成的操作称为伪操作。
伪指令在源程序中的作用是为完成汇编程序作各种准备工作的,这些伪指令仅在汇编过程中起作用,一旦汇编结束,伪指令的使命就完成。
在ARM的汇编程序中,有如下几种伪指令:
符号定义伪指令;
数据定义伪指令;
汇编控制伪指令;
宏指令以及其他伪指令。
6
符号定义(Symbol Definition)伪指令
符号定义伪指令用于定义ARM汇编程序中的变量、对变量赋值以及定义寄存器的别名等操作。常见的符号定义伪指令有如下几种:
用于定义全局变量的GBLA、GBLL和GBLS。
用于定义局部变量的LCLA、LCLL和LCLS。
用于对变量赋值的SETA、SETL、SETS。
为通用寄存器列表定义名称的RLIST。
7
1. GBLA、GBLL和GBLS
语法格式:
GBLA(GBLL或GBLS) 全局变量名
GBLA、GBLL和GBLS伪指令用于定义一个ARM程序中的全局变量,并将其初始化。
其中:
GBLA伪指令用于定义一个全局的数字变量,并初始化为0;
GBLL伪指令用于定义一个全局的逻辑变量,并初始化为F(假);
GBLS伪指令用于定义一个全局的字符串变量,并初始化为空;
由于以上三条伪指令用于定义全局变量,因此在整个程序范围内变量名必须唯一。
8
使用示例:
GBLA Test1 ;定义一个全局的数字变量,变量名为Test1
Test1 SETA 0xaa ;将该变量赋值为0xaa
GBLL Test2 ;定义一个全局的逻辑变量,变量名为Test2
Test2 SETL {TRUE} ;将该变量赋值为真
GBLS Test3 ;定义一个全局的字符串变量,变量名为Test3
Test3 SETS “Testing”;将该变量赋值为“Testing'’
9
2. LCLA、LCLL和LCLS
语法格式:
LCLA (LCLL或LCLS) 局部变量名
LCLA、LCLL和LCLS伪指令用于定义一个ARM程序中的局部变量,并将其初始化。
其中:
LCLA伪指令用于定义一个局部的数字变量,并初始化为0; ;
LCLL伪指令用于定义一个局部的逻辑变量,并初始化为F(假);
LCLS伪指令用于定义一个局部的字符串变量,并初始化为空;
以上三条伪指令用于声明局部变量,在其作用范围内变量名必须唯一。
10
使用示例:
LCLA Test4 ;声明一个局部的数字变量,变量名为Test4
Test3 SETA 0xaa ;将该变量赋值为0xaa
LCLL Test5 ;声明一个局部的逻辑变量,变量名为Test5
Test4 SETL {TRUE};将该变量赋值为真
LCLS Test6 ;定义一个局部的字符串变量,变量名为Test6
Test6 SETS “Testing”;将该变量赋值为“Testing”