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函数内部各嵌入了一段汇编语言编写的程序,该程序完成的是一个字符串的拷贝。  

 Leave a Reply

(必须填写)

(必须填写,邮件地址不会被泄露)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>