152011
 

 

8.预定义变量和内置变量
 
ARM汇编器对ARM的寄存器进行了预定义,所有的寄存器和协处理器名都是大小写敏感的。预定义的寄存器如下:
·R0~R15和r0~r15;
·a1~a4(参数、结果或临时寄存器,与r0~r3同义);
·v1~v8(变量寄存器,与r4~r11同义);
·sb和SB(静态基址寄存器,与r9同义);
·sl和SL(堆栈限制寄存器,与r10同义);
·fp和FP(帧指针,与r11同义);
ip和IP(过程调用中间临时寄存器,与r12同义);
·sp和SP(堆栈指针,与r13同义);
·lr和LR(链接寄存器,与r14同义);
·pc和PC(程序计数器,与r15同义);
·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)。 

        ARM汇编器所定义的内置变量如下表所示。值得注意的是内置变量的设置不能用SETA、SETL或SETS等指示符来设置,只能用表达式或条件来设置。例如:
        IF  {ARCHITECTURE} = “4T” 
内置变量
内置变量
 
 
9.子程序调用规则
 
        ARM9处理器的子程序调用指令有别于Intel X86的子程序调用指令CALL,此小节再对这一特点进行归纳。另外,本小节还将介绍C或C++语言编写的程序与汇编语言编写的程序之间相互调用的规则。 
        程序设计时,通常会把完成某个特定功能的一段程序代码编写成子程序,在需要的地方进行调用。ARM9汇编程序中,使用下面语句调用子程序。
        BL  next
        其中,next为子程序中的第一条指令代码的标号。

        任何一个子程序进入前,处理器需要保存主程序中的现场,即需要保存当前工作寄存器(注意:当采用了子程序嵌套调用时,应该保存LR寄存器)。汇编指令BL的功能是将BL指令的下一条指令地址放到LR寄存器中,作为返回地址。并将子程序的第一条指令地址赋予PC寄存器,实现程序转移,即进入子程序执行。子程序执行完后,通过把LR寄存器值赋予PC寄存器,实现返回。
 
 
10.C语言与ARM汇编相互调用的一个例子
#include <stdio.h>
void test_example1(char * s1,const,char *s2);
 
int main(void)
{
         const  char  *string1 = “test example”;
         char   s[20];
         _asm
         {
         MOV  R0,string1
         MOV  R1,s
         BL   test_example1,{R0,R1}
         }
return  0;
} 
void test_example1(char * s1,const,char *s2){
          int  a1;
          _asm
          {
loop:
#ifndef  _thumb
         LDRB  a1,[s1],#1
         STRB  a1,[s2],#1
#else
         LDRB  a1,[s1]
         ADD   s1,#1
         STRB  a1,[s2]
         ADD   s2,#1
#endif
         CMP   a1,#0
         BNE   loop
         }
} 
        上面一段用C语言编写的程序中内嵌了汇编程序。例子中,test_exampl是一个子程序(函数),主函数是main()。main函数和test_example函数内部各嵌入了一段汇编语言编写的程序,该程序完成的是一个字符串的拷贝。  

142011
 

七、ARM9汇编指令系统

1.概述。

        32位ARM指令集由13种基本指令类型组成,分成4大类。
3种类型的存储器访问指令,用于控制存储器和寄存器之间的数据传送。第一种类型用于优化的灵活寻址;第二种类型用于快速上下文切换;第三种类型用于交换数据。
3种类型的数据处理指令,使用片内的累加器(ALU)、桶形移位器和乘法器,对31个寄存器完成高速数据处理操作。
4种类型的分枝指令,用于控制程序执行流程、指令优先级、ARM代码和Thumb代码的切换。
3种类型的协处理器指令,专用于控制外部协处理器。这些指令以开放和统一的方式扩展了指令集的片外功能。 上述句法形式中所用到的符号意义如下:

 
2.存储器访问指令

        (1) LDR和STR —字和无符号字节32位字8位无符号字节(B)加载寄存器(LDR)和存储寄存器(STR)指令。字节写时是用“0”扩展到32位。

LDR和STR指令都有以下4种句法形式:
op  {cond}  {B}  {T}  Rd,[Rn]                              零偏移
op  {cond}  {B}  Rd,[Rn,Flexoffset]  {!}          前索引偏移
op  {cond}  {B}  Rd,label                                   程序相对偏移
op  {cond}  {B}  {T}  Rd,[Rn],Flexoffset  {!}   后索引偏移

op      操作码,后面所用时意义相同。在此代表LDR和STR。
cond  可选条件码,条件码必须是下表中所列的一种。后面所用时意义相同