arm汇编伪指令

1、 在ARM汇编语言源程序中有些特殊助记符,它们没有相对应的操作码或者机器码,通常称为伪指令

  伪指令在源程序中的作用是为完成汇编程序作各种准备工作的,这些伪指令仅在汇编过程中起作用,一旦汇编结束,伪指令的使命就完成。在ARM汇编程序中,有如下几种伪指令:符号定义伪指令,数据定义伪指令,汇编控制伪指令,信息报告伪指令,宏指令以及其他伪指令

2、 符号定义伪指令,用于定义ARM汇编程序中的变量、对变量赋值以及定义寄存器的别名等操作。

  常见的符号定义伪指令有如下几种(A表示data,L:logic,S:string):

  定义局部变量的LCLA、LCLL、LCLS;(局部变量作用范围为当前段)

  定义全局变量的GBLA、GBLL、GBLS;

  对变量赋值的SETA、SETL、SETS;

  为通用寄存器列表定义名称的RLIST。

 

  例如:

  GBLA     Test1               ;定义一个全局的数字变量,变量名为Test1

  Test1     SETA    0xAA    ;将该变量赋值为0xAA

  GBLL     Test2                ;定义一个全局的逻辑变量,变量名为Test2

  Test2     SETL     {TRUE} ;将该变量赋值为真

  GBLS     Test3                ;定义一个全局的字符串变量,变量名为Test3

  Test3     SETS     “Testing” ;将该变量赋值为”Testing”

3、 数据定义伪指令:用于为数据分配存储单元,同时也可完成已分配存储单元的初始化

  a)     DCB:

    语法:标号  DCB     表达式

    说明:DCB用于分配一片连续的字节存储单元并用伪指令中指定的表达式进行初始化。其中,表达式可以为使用双引号的字符串或0~255的数字,DCB可用“=”代替。内存分配字节数由表达式决定。

    例如:  Str   DCB “This is a test!”;分配一片连续的字节存储单元并初始化

  b)     DCD/DCDU:

    语法:标号  DCD/DCDU       表达式

    说明:DCD伪指令用于分配一片连续的存储单元并用伪指令中指定的表达式初始化,它定义的存储空间是字对齐的。DCD也可用“&”代替。表达式可以为常量表达式或程序中的地址标号。DCDU功能跟DCD类似,只是分配的存储单元不严格字对齐。

    例如: DataTest  DCD     4,5,64

  c)     SPACE:

    语法:标号  SPACE   表达式

    说明:SPACE用于分配一片连续的存储区域并初始化为0,表达式为要分配的字节数,SPACE也可用“%”代替

    例如: Data   Space   SPACE 100      ;分配连续100字节的存储单元并初始化为0

  d)     MAP:

    语法:MAP  表达式  [,基址寄存器]

    说明:MAP定义一个结构化的内存表的首地址,“^”可以用来代替MAP。

    表达式可以为程序中的标号或数学表达式,基址寄存器为可选项,当基址寄存器选项不存在时,表达式的值即为内存表的首地址,当该选项存在时,内存表的首地址为表达式的值与基址寄存器的和。MAP伪指令通常与FIELD伪指令配合使用来定义结构化的内存表。

  e)     FILED:

    语法:标号  FIELD   字节数

    说明:FIELD用于定义一个结构化内存表中的数据域,“#”可用来代替FILED。

  注意:MAP和FILED仅用于定义数据结构,并不实际分配存储单元。FIELD伪指令常与MAP伪指令配合使用来定义结构化的内存表。MAP伪指令定义内存表的首地址,FIELD伪指令定义内存表中的各个数据域,并可以为每个数据域指定一个标号供其他的指令引用。

    使用示例:

    MAP     0x30000000 ;定义结构化内存表首地址的值为0x30000000

    A    FIELD   4    ;定义数据域A,长度为4字节,位置为0x30000000

    B    FIELD   4    ;定义数据域B,长度为4字节,位置为0x30000004

    C    FIELD   4    ;定义数据域C,长度为4字节,位置为0x30000008

    。。。

    LDR           R1, A    ;将0x30000000地址内容加载到R1

    STR      R2, B    ;将R2的值存储到地址为0x30000004内存单元

  f)       

4、 汇编控制伪指令:汇编控制伪操作用于控制汇编程序的执行流程

  a)     MACRO、MEND(宏定义)

    MACRO

      [$标号] 宏名     [$参数1,$参数2,……]

      指令序列

    MEND

    在源程序被编译时,汇编器将宏调用展开,用宏定义中的指令序列替换程序中的宏调用,并将实际参数的值传递给宏定义中的参数。

  注意:宏操作可以嵌套使用,并可以在编译时用选项加以控制。

  b)     IF、ELSE、ENDIF(条件语句)

    IF    逻辑表达式

      代码段1

    ELSE

      代码段2

    ENDIF

    IF、ELSE、ENDIF可以分别用“[”、“|”、“]”代替。IF、ELSE、ENDIF伪指令可以嵌套使用。

  c)     WHILE、WEND:

    WHILE   逻辑表达式

      指令序列

    WEND

  d)     MEXIT:

    MEXIT

    说明:MEXIT用于从宏中退出。

5、 其他伪指令:

  a)     ALIGN

    语法:ALIGN     [表达式 [,偏移量]]

    说明:ALIGN伪操作可以通过填充字节使当前的位置满足一定的对齐方式。其中,表达式的值为2的幂,如1、2、4、8、16等,用于指定对齐方式。

    例如:

    AREA    Init, CODE, READONLY, ALIGN=3; 指定后面的指令为8字节对齐。

  b)     AREA

    语法:AREA段名属性,……

    说明:AREA用于定义一个代码段、数据段或者特定属性的段。属性部分表示该代码段/数据段的相关属性,多个属性可以用逗号“,”分隔

  c)     CODE16/CODE32

    说明:CODE16伪操作指示编译器后面的代码为16位的Thumb指令。CODE32伪操作指示编译器后面的代码为32位的ARM指令。

    在使用ARM指令和Thumb指令混合编程的代码里,可用这两条伪指令进行切换,但注意它们只通知编译器其后指令的类型,并不能对处理器进行状态的切换(涉及ARM状态的切换需使用BX指令)。

  d)     ENTRY

    说明:ENTRY用于指定汇编程序的入口。在一个完整的汇编程序中至少要有一个ENTRY,程序中也可以有多个,此时,程序的真正入口点可在链接时指定,但在一个源文件里最多只能有一个ENTRY或者没有ENTRY。

  e)     EQU

    语法:名称  EQU     表达式[,类型]

    说明:EQU用于将程序中的数字常量、标号、基于寄存器的值赋予一个等效的名称,这一点类似于C语言中的#define,可用“*”代替EQU。

    如果表达式为32位的常量,我们可以指定表达式的数据类型,类型域可以有以下三种:CODE16/CODE32/DATA

    例如:NUM       EQU     100      ;定义标号NUM值为100

    Addr     EQU     0xAA, CODE32   ;定义Addr的值为0xAA,且该处为32位的ARM指令

  f)      EXPORT

    语法:EXPORT   标号

    说明:EXPORT 在程序中声明一个全局标号,该标号可以在其他的文件中引用。用户也可以用GLOBAL代替EXPORT。标号在程序区分大小写

  g)     IMPORT

    语法:IMPORT  标号

    说明:IMPORT告诉编译器这个标号要在当前源文件中使用,但标号是在其他的源文件中定义的。不管当前源文件是否使用过该标号,这个标号都会加入到当前源文件的符号表中。标号在程序中区分大小写。

    例如:

    AREA    Init,CODE,READONLY

    IMPORT           Main           ;通知编译器当前文件要引用标号Main,但是Main在其他源文件中定义。

  h)      

6、  

posted on 2013-03-16 17:13  suwen  阅读(1102)  评论(0编辑  收藏  举报

导航