DIY编程器网

标题: ARM汇编程序设计之:ARM汇编器所支持的伪操作 [打印本页]

作者: admin    时间: 2014-10-10 07:23
标题: ARM汇编程序设计之:ARM汇编器所支持的伪操作
ARM源程序文件(即源文件)有特定的文件格式和语法规则,可以使用任意文本编辑器编写程序代码。一般地,ARM源程序文件名的后缀如表10.1所示。
         
        表10.1 ARM源程序文件名后缀
                                                                        程    序
                       
                                                                        文  件  名
                       
                                                                        汇编
                       
                                                                        *.S
                       
                                                                        引入文件
                       
                                                                        *.INC
                       
                                                                        C程序
                       
                                                                        *.C
                       
                                                                        头文件
                       
                                                                        *.H
                       
         
        在一个项目中,至少要有一个汇编源文件,可以有多个汇编源文件或多个C程序,或者C程序文件和汇编文件两者的组合。
        ARM汇编语言语句格式如下所示。
         
        {label}{instruction/directive/pseudo-instruction}{;comment}
         
                                                                         
                       
                                                                        注意
                       
                                                                        所有指令均不能顶格写,要用空格(space)或TAB开头。
                       
         
        其中instruction即ARM指令集中的汇编指令。Directive为ARM汇编器所支持的伪操作。pseudo-instruction为ARM汇编器所支持的伪操作。下面章节分别介绍伪操作和伪指令。
         
        10.1  ARM汇编器所支持的伪操作

        在ARM汇编语言程序里,有一些特殊指令助记符,这些助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊指令助记符为伪操作标识符(directive),它们所完成的操作称为伪操作。伪操作在源程序中的作用是为完成汇编程序作各种准备工作的,这些伪操作仅在汇编过程中起作用,一旦汇编结束,伪操作的使命就完成。
         
        在ARM的汇编程序中,伪操作主要有符号定义伪操作、数据定义伪操作、汇编控制伪操作、宏指令等。
         
        10.1.1  符号定义(Symbol Definition)伪操作

        符号定义伪操作用于定义ARM汇编程序中的变量、对变量赋值以及定义寄存器的别名等操作。常见的符号定义伪操作有如下几种。
         
        ·  用于定义全局变量的GBLA、GBLL和GBLS。
        ·  用于定义局部变量的LCLA、LCLL和LCLS。
        ·  用于对变量赋值的SETA、SETL、SETS。
        ·  为通用寄存器列表定义名称的RLIST。
        ·  为协处理器寄存器定义别名的CN。
        ·  为协处理器定义别名的CP。
        ·  为VFP寄存器定义名称的DN和SN。
        ·  为FPA浮点指针寄存器定义名称的FPA。
         
        1.全局变量定义伪操作GBLA、GBLL和GBLS

        (1)语法格式
        GBLA、GBLL和GBLS伪操作用于定义一个ARM程序中的全局变量并将其初始化。其中:
        GBLA伪操作用于定义一个全局的数字变量并初始化为0。
        GBLL伪操作用于定义一个全局的逻辑变量并初始化为F(假)。
        GBLS伪操作用于定义一个全局的字符串变量并初始化为空。
         
        由于以上3条伪指令用于定义全局变量,因此在整个程序范围内变量名必须惟一。
        语法格式如下。
         
        <gblx>   <variable>
         
        ① <gblx>
        取值为GBLA、GBLL、GBLS之一。
         
        ② <variable>
        定义的全局变量名,在其作用范围内必须惟一。全局变量的作用范围为包含该变量的源程序。
         
        (2)使用说明
        如果用这些伪操作重新声明已经声明过的变量,变量的值将被初始化成后一次声明语句中的值。
         
        (3)示例
        ① 使用伪操作声明全局变量。
         
            GBLA       Test1 ;定义一个全局的数字变量,变量名为Test1
            Test1  SETA    0xaa ;将该变量赋值为0xaa
            GBLL       Test2 ;定义一个全局的逻辑变量,变量名为Test2
            Test2  SETL    {TRUE} ;将该变量赋值为真
            GBLS       Test3 ;定义一个全局的字符串变量,变量名为Test3
            Test3  SETS     "Testing" ;将该变量赋值为“Testing”
         
        ② 声明变量objectsize并设置其值为0xff,为“SPACE”操作做准备。
         
              GBLA         objectsize
        Objectsize       SETA     oxff
         
              SPACE      objectsize
         
        ③ 下面的例子显示如何使用汇编命令设置变量的值。具体做法是使用“-pd”选项。
         
            Armasm  -pd  "objectsize  SETA  oxff"  -o  objectfile  sourcefile
         
        2.局部变量定义伪操作LCLA、LCLL和LCLS

        (1)语法格式
        LCLA、LCLL和LCLS伪指令用于定义一个ARM程序中的局部变量并将其初始化。其中:
        LCLA伪操作用于定义一个局部的数字变量并初始化为0。
        LCLL伪操作用于定义一个局部的逻辑变量并初始化为F(假)。
        LCLS伪操作用于定义一个局部的字符串变量并初始化为空。
         
        以上三条伪操作用于声明局部变量,在其作用范围内变量名必须惟一。
        语法格式如下。
         
        <lclx>   <variable>
         
        ① <gblx>
        取值为LCLA、LCLL、LCLS之一。
         
        ② <variable>
        所定义的局部变量名,在其作用范围内必须惟一。局部变量作用范围为包含该局部变量的宏。
         
        (2)使用说明
        如果用这些伪操作重新声明已经声明过的变量,则变量的值将被初始化成后一次声明语句中的值。
         
        (3)示例
        ① 使用伪操作声明局部变量。
         
            LCLA       Test4 ;声明一个局部的数字变量,变量名为Test4
            Test3  SETA     0xaa ;将该变量赋值为0xaa
            LCLL       Test5 ;声明一个局部的逻辑变量,变量名为Test5
            Test4  SETL     {TRUE} ;将该变量赋值为真
            LCLS       Test6 ;定义一个局部的字符串变量,变量名为Test6
            Test6  SETS   "Testing" ;将该变量赋值为“Testing”
         
        ② 下面的例子定义一个宏,显示了局部变量的作用范围。
         
              MACRO ;声明一个宏
        $label    message  $a ;宏原型
              LCLS    err ;声明局部字符串变量
        $label
              INFO        0,"err":CC::STR:$a
              MEND ;宏结束,局部变量不再起作用
         
        3.变量赋值伪操作SETA、SETL和SETS

        (1)语法格式
        伪指令SETA、SETL和SETS用于给一个已经定义的全局变量或局部变量赋值。
        SETA伪操作用于给一个数学变量赋值;
        SETL伪操作用于给一个逻辑变量赋值;
        SETS伪操作用于给一个字符串变量赋值;
         
        语法格式如下。
         
        Variable  <setx>  expr
         
        ① Variable
        变量名为已经定义过的全局变量或局部变量,表达式为将要赋给变量的值。
         
        ② <setx>
        取值为SETA、SETL、SETS之一。
         
        ③ expr
        数学、逻辑或字符串表达式,也就是将要赋予变量的值。
         
        (2)使用说明
        在向变量赋值前必须先声明变量。
        也可以在汇编指令中预定义变量,如:
         
        "Armasm  --pd  "objectsize  SETA  oxff"  --o  objectfile  sourcefile"
         
        (3)示例
        ① 为预先定义的变量赋值。
         
            LCLA       Test3 ;声明一个局部的数字变量,变量名为Test3
            Test3  SETA  0xaa ;将该变量赋值为0xaa
            LCLL       Test4 ;声明一个局部的逻辑变量,变量名为Test4
            Test4  SETL  {TRUE} ;将该变量赋值为真
            LCLS       Test6 ;定义一个局部的字符串变量,变量名为Test6
            Test6  SETS   "Testing" ;将该变量赋值为“Testing”
         
        ② 使用变量赋值伪操作,定义一些程序相关内容。
         
            GBLA               versionNumber
            VersionNumber   SETA    21
         
            GBLL               Debug
            Debug SETL  {TRUE}
         
            GBLS versionString
            VersionString    SETS   "version 1.0"
         
        4.通用寄存器列表定义伪操作RLIST

        (1)语法格式
        RLIST伪操作可用于对一个通用寄存器列表定义名称,使用该伪操作定义的名称可在ARM指令LDM/STM中使用。在LDM/STM指令中,列表中的寄存器访问次序根据寄存器的编号由低到高,与列表中的寄存器排列次序无关。
         
        语法格式如下。
         
        Name  RLIST  {list-of-registers}
         
        ① Name
        寄存器列表的名称。
         
                                                                         
                       
                                                                        注意
                       
                                                                        该名称不能和已经定义寄存器或协处理器名称相同。
                       
         
        ② list-of-registers
        通用寄存器列表。列表中的寄存器用“,”隔开,如果是编号连续的通用寄存器可以用“-”指定寄存器范围。具体用法参见程序示例。
         
        (2)使用说明
        在使用ARM汇编编译器编译源文件时,可以使用“-checkreg”选项来指定汇编器进行寄存器检查。如果汇编器检测到寄存器列表中的寄存器编号非升序排列,将给出编译警告。
         
        (3)示例
        ① 将寄存器列表名称定义为RegList,可在ARM指令LDM/STM中通过该名称访问寄存器列表。
         
        RegList  RLIST  {R0-R5,R8,R10}     ;
         
        ② 使用“-”在寄存器列表中,指定寄存器范围。
         
        Context  RLIST  {r0-r6,r8,r10-r12,r15} ;
         
        5.协处理器寄存器名称定义伪操作CN

        (1)语法格式
        CN伪操作为协处理器寄存器定义名称。
        语法格式如下。
         
        Name  CN  expr
         
        ① Name
        定义的协处理器寄存器的名称。
         
                                                                         
                       
                                                                        注意
                       
                                                                        该名称不能和已经定义寄存器或协处理器名称相同。
                       
         
        ② expr
        协处理器寄存器编号。
         
        (2)使用说明
        协处理器寄存器编号的数值范围为0~15。避免使用不同的名称定义同一物理寄存器。
         
                                                                         
                       
                                                                        注意
                       
                                                                        协处理器寄存器的名称不能被定义为c0~c15,这些名称已经被汇编器预定义。
                       
         
        (3)示例
        将协处理器寄存器6命名为Power。
         
        Power     CN  6
         
        6.协处理器名称定义伪操作CP

        (1)语法格式
        CP伪操作为指定的协处理器定义名称。
         
        语法格式如下。
         
        Name    CP  expr
         
        ① Name
        定义的协处理器名称。
         
                                                                         
                       
                                                                        注意
                       
                                                                        该名称不能和已经定义寄存器或其他协处理器名称相同。
                       
         
        ② expr
        协处理器编号。
         
        (2)使用说明
        协处理器编号范围为0~15。
        使用CP伪操作为协处理器定义一个方便记忆的名称,可以使程序员更高效地编写代码。
         
                                                                         
                       
                                                                        注意
                       
                                                                        协处理器寄存器的称不能被定义为p0~p15,这些名称已经被汇编器预定义。
                       
         
        (3)示例
        将协处理器6命名为Dmu。
         
        Dmu    CP  6
         
        7.VFP寄存器名称定义伪操作DN/SN

        (1)语法格式
        DN伪操作为双精度(double-precision)VFP寄存器定义名称。D0~D15是汇编器预先定义的,用户不能使用。
         
        SN伪操作为单精度(single-precision)VFP寄存器定义名称。S0~S31是汇编器预先定义的,用户不能使用。
         
        语法格式如下。
         
        Name  DN  expr
        Name  SN  expr
         
        ① Name
        指定的VFP寄存器的名称。
         
                                                                         
                       
                                                                        注意
                       
                                                                        该名称不能和已经定义寄存器或其他协处理器名称相同。
                       
         
        ② expr
        指定VFP寄存器编号。对于双精度寄存器编号范围为0~15;对于单精度寄存器编号范围为0~31。
         
        (2)示例
        ① 将VFP双精度寄存器6定义为energy。
         
        energy     DN  6
         
        ② 将VFP单精度寄存器16定义为mass。
         
        mass  SN  16
         
        8.浮点寄存器名称定义伪操作FN

        (1)语法格式
        FN为一个FPA浮点寄存器定义名称。F0~F7是汇编器预先定义的,用户不能使用。
         
                                                                         
                       
                                                                        注意
                       
                                                                        FPA的使用在ARM公司新发布的编译器RVCT中已不再支持。
                       
         
        语法格式如下。
         
        Name  FN  expr
         
        ① Name
        指定的浮点寄存器的名称。
         
                                                                         
                       
                                                                        注意
                       
                                                                        该名称不能和已经定义寄存器或其他协处理器名称相同。
                       
         
        ② expr
        指定浮点寄存器编号。编号范围为0~7。
         
        (2)示例
        为浮点寄存器6指定名称为Energy。
         
        Energy    FN  6




欢迎光临 DIY编程器网 (http://diybcq.com./) Powered by Discuz! X3.2