您的位置 首页 软件

ARM汇编常用伪操作总结

在分析2410工程中启动代码的过程中,除了一些常用的汇编如ldr,str,bic等,还有一些很陌生的符号让我们很困惑,到网上一查资料,噢,原来是ARM的一些伪操作。为了在阅读启动代码的过程中不会出

  在剖析 2410 工程中发动代码的过程中,除了一些常用的汇编如 ldr,str,bic 等,还有一些很生疏的符号让我们很困惑,到网上一查材料,噢,原来是 ARM 的一些伪操作。为了在阅览发动代码的过程中不会呈现很大的阅览与了解妨碍,就总结了发动代码中用到的伪操作以供了解和查阅

  PS: 这儿说一下自己对汇编指令的观点,感觉就如英语单词似的,在进行阅览之前有必要具有一些词汇量,但不需求精记,因为精记的话量太大太杂,不容易把握,效果也欠好。最好的办法是一些单词有一些大约的形象,也便是粗记,然后在阅览中不断的加强形象,终究结实把握它。

  所以在这儿不需求对一切的伪操作都记牢,配合着小比如先对其有个形象,然后在看发动代码的过程中不断的温习查阅,就能很快把握之~~

  大局操作

  GET (或 INCLUDE )

  语法格局:

  GET 文件名

  GET 伪操效果于将一个源文件包括到当时的源文件中 ,并将被包括的源文件在当时方位进行汇编处理。能够运用 INCLUDE 代替 GET 。能够运用途径信息(途径信息中能够包括空格)。

  汇编程序中常用的办法是在某源文件中界说一些宏指令,用 EQU 界说常量的符号称号,用 MAP 和 FIELD 界说结构化的数据类型,这样的源文件类似于 C 言语中的 .H 文件。然后用 GET 伪操作将这个源文件包括到其他的源文件中。运用办法与 C 言语中的 include “*.h” 类似。

  GET 伪操作只能用于包括源文件,包括方针文件需求运用 INCBIN 伪操作

  运用示例:

  AREA Init , CODE , READONLY

  GET a1.s ;告知编译器当时源文件包括源文件 a1.s

  GET C:\project\file2.s ;告知编译器当时源文件包括源文件 C:\project\file2.s

  END

  AREA

  语法格局:

  AREA 段名 特点 1 ,特点 2 , ……

  AREA 伪指令用于界说一个代码段或数据段 。其间,段名若以数字最初,则该段名需用 “ | ” 括起来,如 |1_test| 。还有一些代码段具有约好的称号,如 |.text| 表明 C 言语编译器发生的代码段或许是与 C 言语库相关的代码段。

  特点字段表明该代码段(或数据段)的相关特点,多个特点用逗号分隔。常用的特点如下:

  — CODE 特点:用于界说代码段,默以为 READONLY 。

  — DATA 特点:用于界说数据段,默以为 READWRITE 。

  — NOINIT 特点:指定本数据段仅仅保留了内存单元,而没有将各初始值写入内存单元,或许将各内存单元初始化为 0.

  — READONLY 特点:指定本段为只读,代码段默以为 READONLY 。

  — READWRITE 特点:指定本段为可读可写,数据段的默许特点为 READWRITE 。 运用示例:

  AREA Init , CODE , READONLY

  该伪操作界说了一个代码段,段名为 Init ,特点为只读

  ENTRY

  语法格局:

  ENTRY

  ENTRY 伪操效果于指定汇编程序的进口点 。在一个完好的汇编程序中至少要有一个 ENTRY (也能够有多个,当有多个 ENTRY 时,程序的真实进口点由链接器指定),但在一个源文件里最多只能有一个 ENTRY (能够没有)。

  运用示例:

  AREA Init , CODE , READONLY

  ENTRY ;指定应用程序的进口点

  ……

  END

  语法格局:

  END

  END 伪操效果于告知编译器现已到了源程序的完毕 。

  运用示例:

  AREA Init , CODE , READONLY

  ……

  END ;指定应用程序的完毕

  符号操作

  ALIGN

  语法格局:

  ALIGN { 表达式 { ,偏移量 }}

  ALIGN 伪指令可经过增加填充字节的方法,使当时方位满意必定的对其方法 。其间,表达式的值用于指定对齐方法,或许的取值为 2 的幂,如 1 、 2 、 4 、 8 、 16 等。若未指定表达式,则将当时方位对齐到下一个字的方位。偏移量也为一个数字表达式,若运用该字段,则当时方位的对齐方法为: 2 的表达式次幂+偏移量。

  下面的状况中,需求特定的地址对齐方法:

  1 ) Thumb 的宏指令 ADR 要求地址是字对齐的,而 Thumb 代码中地址标号或许不是字对齐的。这时就要运用伪操作 ALIGN 4 使 Thumb 代码中的地址标号字对齐。

  2 ) 因为有些 ARM 处理器的 CACHE 采用了其他对齐方法,如 16 字节的对齐方法,这时运用 ALIGN 伪操作指定适宜的对齐方法能够充分发挥该 CACHE 的功能优势。

  3 ) LDRD 以及 STRD 指令要求内存单元是 8 字节对齐的。这样在为 LDRD/STRD 指令分配的内存单元前要运用 ALIGN 8 完成 8 字节对齐方法。

  4 ) 地址标号一般自身没有对齐要求。而在 ARM 代码中要求地址标号是字对齐的,在 Thumb 代码中要求字节对齐。这样需求运用适宜的 ALIGN 伪操作来调整对齐方法。

  运用示例:

  在 AREA 伪操作中的 ALIGN 与 ALIGN 伪操作中表达式意义是不同的

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

  CODE16 、 CODE32

  语法格局:

  CODE16 (或 CODE32 )

  CODE16 伪操作告知编译器,这以后的指令序列为 16 位的 Thumb 指令 。

  CODE32 伪操作告知编译器,这以后的指令序列为 32 位的 ARM 指令 。

  若在汇编源程序中一起包括 ARM 指令和 Thumb 指令时,可用 CODE16 伪操作告知编译器这以后的指令序列为 16 位的 Thumb 指令, CODE32 伪操作告知编译器这以后的指令序列为 32 位的 ARM 指令。因而,在运用 ARM 指令和 Thumb 指令混合编程的代码里,可用这两条伪操作进行切换,但留意他们仅仅告知编译器这以后指令的类型,自身并不能对处理器进行程序状况的切换。

  运用示例:

  AREA Init , CODE , READONLY

  ……

  CODE32 ;告知编译器这以后的指令为 32 位的 ARM 指令

  LDR R0 ,= NEXT + 1 ;将跳转地址放入寄存器 R0

  BX R0 ;程序跳转到新的方位履行,并将处理器切换到 Thumb 作业状况

  ……

  CODE16 ;告知编译器这以后的指令为 16 位的 Thumb 指令

  NEXT LDR R3 ,= 0x3FF

  ……

  END ;程序完毕

  EQU ( “ * ” )

  语法格局:

  称号 EQU 表达式 { ,类型 }

  EQU 伪操效果于为程序中的常量、根据寄存器的值和程序中的标号界说一个字符称号,其效果类似于 C 言语中的# define 。

  称号为 EQU 伪操作界说的字符称号,表达式为根据寄存器的地址值、程序中的标号、 32 位的地址常量或许 32 位的常量。当表达式为 32 位的常量时,能够指定表达式的数据类型,能够有以下三种类型:

  CODE16 、 CODE32 和 DATA

  运用示例:

  Test EQU 50 ;界说标号 Test 的值为 50

  Addr EQU 0x55 , CODE32 ;界说 Addr 的值为 0x55 ,且该处为 32 位的 ARM 指令。

  EXPORT (或 GLOBAL )

  语法格局:

  EXPORT 符号 {[WEAK]}

  EXPORT 伪操作声明一个符号能够被其他文件引证,相当于声明晰一个大局变量 。 EXPORT 可用 GLOBAL 代替。符号在程序中区别巨细写, [WEAK] 选项声明其他的同名符号优先于该符号被引证。

  运用示例:

  AREA Init , CODE , READONLY

  EXPORT DoAdd ;下面的函数称号 DoAdd 能够被其他源文件引证

  DoAdd ADD r0,r0,r1

  END

  IMPORT

  语法格局:

  IMPORT 符号 {[WEAK]}

  IMPORT 伪操作告知编译器当时的符号不是在根源文件中界说的,而是在其他源文件中界说的,在根源文件中或许引证该符号 ,并且不管根源文件是否实践引证该符号,该符号均会被加入到根源文件的符号表中符号在程序中区别巨细。

  符号在程序中区别巨细写, [WEAK] 指定这个选项后,假如符号在一切的源文件中都没有界说,编译器也不会发生任何过错信息,一起编译器也不会到当时没有被 INCLUDE 进来的库中去查找该符号。

  运用 IMPORT 伪操作声明一个符号是在其他源文件中界说的。假如衔接器在衔接处理时不能解析该符号,而 IMPORT 伪操作中没有指定 [WEAK] 选项,则衔接器会陈述过错。假如衔接器在衔接处理时不能解析该符号,而 IMPORT 伪操作中指定了 [WEAK] 选项,则衔接器将不会陈述过错,而是进行下面的操作:

  1 ) 假如该符号被 B 或许 BL 指令引证,则该符号被设置成下一条指令的地址,该 B 或许 BL 指令相当于一条 NOP 指令

  2 ) 其他状况下该符号被设置为 0.

  运用示例:

  AREA Init , CODE , READONLY

  IMPORT Main ;告知编译器当时文件要引证标号 Main ,但 Main 在其他源文件中界说 ……

  END

  EXTERN

  语法格局:

  EXTERN 符号 {[WEAK]}

  EXTERN 伪操作告知编译器当时的符号不是在根源文件中界说的,而是在其他源文件中界说的,在根源文件中或许引证该符号。假如根源文件没有实践引证该符号,该符号将不会被加入到根源文件的符号表中。

  注:与 IMPORT 的不同之处

  运用示例:

  AREA Init , CODE , READONLY

  EXTERN Main ;告知编译器当时文件要引证标号 Main ,但 Main 在其他源文件中界说 ……

  END

  操控操作

  MACRO MEND

  语法格局:

  MACRO

  [$ label] macroname{ $ parameter1 , $ parameter ,…… }

  指令序列

  MEND

  MACRO 伪操作标识宏界说的开端, MEND 标识宏界说的完毕。用 MACRO 及 MEND 界说一段代码,称为宏界说体,这样在程序中就能够经过宏指令屡次调用该代码段。

  其间, $ label 在宏指令被打开时, label 会被替换成相应的符号,一般是一个标号。在一个符号前运用 $ 表明程序被汇编时将运用相应的值来代替 $ 后的符号。

  macroname 为所界说的宏的称号。

  $parameter 为宏指令的参数。当宏指令被打开时将被替换成相应的值,类似于函数中的形式参数,能够在宏界说时为参数指定相应的默许值。

  宏指令的运用方法和功能与子程序有些类似,子程序能够供给模块化的程序设计、节约存储空间并进步运转速度。但在运用子程序结构时需求维护现场,然后增加了体系的开支,因而,在代码较短且需求传递的参数较多时,能够运用宏汇编技能。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/ruanjian/318904.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部