原创 ARM汇编语言小结

2007-1-3 21:56 3536 1 1 分类: MCU/ 嵌入式

                                          ARM汇编语言小结


<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 


ARM汇编语言源程序语句,一般由指令,伪操作,宏指令和伪指令作成.


ARM汇编语言的设计基础是汇编伪指令,汇编伪操作和宏指令.


    伪操作,ARM汇编语言程序里的一些特殊的指令助记符,其作用主要是为完成汇编程序做各种准备工作,在源程序运行汇编程序处理,而不是在计算机运行期间有机器执行.也就是说,这些伪操作只是汇编过程中起作用,一旦汇编结束,伪操作的使命也就随之消失.


    宏指令,是一段独立的程序代码,可以插在程序中,它通过伪操作来定义,宏在被使用之前必须提前定义好,宏之间可以互相调用,也可自己递归调用.通过直接书写宏名来使用宏.并本具宏指令的格式输入输出参数.宏定义本身不产生代码,只是在调用它时把宏体插入到原程序中.宏与C语言中的子函数形参和实参的调用相似,调用宏时通过实际的指令来  代替宏体实现相关的一段代码,但宏的调用与子程序的调用有本质的区别,既宏并不会节省程序的空间,其优点是简化程序代码,提高程序的可读性以及宏内容可以同步修改.


    伪操作,宏指令一般与编译程序有关,因此ARM汇编语言的伪操作,宏指令在不同的编译环境下有不同的编写形式和规则.目前常用的ARM编译环境有2.


    伪指令也是ARM汇编语言程序里的特殊助记符,也不在处理器运行期间由机器执行,他们在汇编时将被合适的机器指令代替成ARMThumb指令,从而实现真正的指令操作.


常见的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

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
1
关闭 站长推荐上一条 /3 下一条