杂项伪指令

杂项伪指令在汇编编程设计较为常用,如段定义伪指令,入口点设置伪指令,包含文件伪指令,标号导出或引入声明等,该类伪指令如下:
         边界对齐: ALIGN。
         段定义: AREA。
         指令集定义: CODE16 和CODE32。
         汇编结束: END。
         程序入口: ENTRY。
         常量定义: EQU。
         声明一个符号可以被其它文件引用:EXPORT 和GLORBAL。
         声明一个外部符号:IMPORT 和EXTERN。
         包含文件:GET 和INCLUDE。
         包含不被汇编的文件:INCBIN。
         保留符号表中的局部符号:KEEP。
         禁止浮点指令:NOFP。
         指示两段之间的依赖关系:REQUIRE。
         堆栈8 字节对齐:PEQUIRE8 和PRESERVE8。
         给特定的寄存器命名:RN。
         标记局部标号使用范围的界限:ROUT。

ALIGN------         ALIGN 伪指令通过添加补丁字节使当前位置满足一定的对齐方式。

伪指令格式:
         ALIGN {expr{,offset}}
         其中:expr 数字表达式,用于指定对齐的方式。取值为2 的n 次幂,如1、2、4、8等,不能为0 其没有expr,则默认为字对齐方式。
         offset 数字表达式,当前位置对齐到下面形式的地址处:offset+n*expr
         在下面的情况中,需要特定的地址对齐方式:
         (A)Thumb 伪指令ADR 要求地址是字对齐的。而Thumb 代码中地址标号可能不是字对齐的。这时就要使用伪指令ALIGN4 使Thumb 代码中地址标号为字对齐。
         (B)由于有些ARM 处理器的Cache 采用了其他对齐方式。如16 字节对齐方式,这时使用ALIGN 伪指令指定合适的对齐方式可以充分发挥Cache 的性能优势。
         (C)LDRD 和STRD 指令要求存储单元为8 字节对齐。这样在为LDRD/STRD 指令分配的存储单元前要使用伪指令ALIGN8 实现8 字节对齐方式。
         (D)地址标号通常自身没有对齐要求,而在ARM 代码中要求地起标号对齐是字对齐的,Thumb 代码中要求半字对齐。这样可以使用ALIGN4 和ALIGN2 伪指令来调整对齐方式。
         伪指令应用举例如下。
         通过ALIGN 伪指令使程序中的地址标号字对齐:
         AREA Example,CODE,READONLY ;声明代码段Example
         START LDR R0,=Sdfjk
         …
         MOV PC,LR
         Sdfjk DCB 0x58 ;定义一字节存储空间,字对齐方式被破坏
         ALIGN ;声明字对齐
         SUBI MOV R1,R3 ;其它代码
         …
         MOV PC,LR
         在段定义AREA 中,也可使用ALIGN 伪指令对齐,但表达式的数字含义是同的
         AREA MyStack,DATA,NOINIT,ALIGN=2 ;声明数据段
         ;MyStack,并重新字对齐
         IrqStackSpace SPACE IRQ_STACK_LEGTH*4 ;中断模式堆栈空间
         FiqStackSpace SPACE FIQ_STACK_LEGTH*4 ;快速中断模式堆栈空间
         AbtStackSpace SPACE ABT_STACK_LEGTH*4 ;中止义模式堆栈空间
         UndtStackSpace SPACE UND_STACK_LEGTH*4 ;未定义模式堆栈
         …
         将两个字节的数据放在同一个字的第一个字节和第四个字节中,带offset 的ALIGN对齐:
         AREA offsetFxample, CODE
         DCB 0x31 ;第一个字节保存0x31
         ALIGN 4,3 ;字对齐
         DCB 0x32 ;第四个字节保存0x32
         …

AREA

AREA 伪指令用于定义一个代码段或数据段。ARM 汇编程序设计采用分段式设计,一个ARM 源程序至少需要一个代码段,大的程序可以包含多少个代码段及数据段。
         伪指令格式:
         AREA sectionname{,attr}{,attr}…
         其中:sectionname 所定义的代码段或数据段的名称。如果该名称是以数据开头的,则该名称必须用“|”括起来,如|1_datasec|。还有一些代码段具有的约定的名称。如|text|表示C 语言编译器产生的代码段或者与C 语言库相关的代码段。
         attr 该代码段或数据段的属性。
         在AREA 伪指令中,各属性之间用逗号隔开。以下为段属性及相关说明:
         ALIGN = expr。默认的情况下,ELF 的代码段和数据段是4 字节对齐的,expr 可以取0~31 的数值,相应的对齐方为2expr 字节对齐。如expr=3 时为字节对齐。对于代码段,expr 不能为0 或1。
         ASSOC = section。指定与本段相关的ELF 段。任何时候连接section 段也必须包括sectionname 段。
         DODE 为定义代码段。默认属性为READONLY。
         COMDEF 定义一个通用的段。该段可以包含代码或者数据。在其它源文件中,同名的COMDEF 段必须相同。
         COMMON 定义一个通用的段。该段不包含任何用户代码和数据,连接器将其初始化为此。各源文件中同名的COMMON 段共用同样的内存单元,连接器为其分配合适的尺寸。
         DATA 为定义段。默认属性为READWRITE。
         NOINIT 指定本数据段仅仅保留了内存单元,而没有将各初始写入内存单元,或者将内存单元值初始化为0。
         READONLY 指定本段为只读,代码段的默认属性为READONLY。
         READWRITE 指定本段为可读可写。数据段的默认属性为READWRITE。
         使用AREA 伪指令将程序分为多个ELF 格式的段,段名称可以相同, 这时同名的段被放在同一个ELF 段中。
         伪指令应用举例如下:
         AREA Example ,CODE,READNOLY ;声明一个代码,名为Example

CODE16 和CODE32

CODE16 伪指令指示汇编编译器后面的指令为16 位的Thumb 指令。  CODE32 伪指令指示汇编编译器后面的指令为32 位的ARM 指令。
         伪指令格式:
         CODE16
         CODE32
         CODE16 和CODE32 伪指令只是指示汇编编译器后面的指令的类型,伪指令本身并不进行程序状态的切换。要进行状态切换,可以使用BX 指令操作。
         伪指令应用举例如下:
         AREA Example CODE,READONLY
         CODE32
         …
         使用CODE16 和CODE32 定义Thumb 指令及ARM 指令并用BX 指令进行切换。
         CODE16 和CODE32 的使用:
         AREA ArmThumC,CODE,READONLY
         CODE32
         ADR R0,ThumbStart+1
         BX R0
         CODE16
         ThumbStart
         MOV R0,#10
         …
         END

END

END 伪指令用于指示汇编编译器源文件已结束。每一个汇编源文件均要使用一个END 伪指令,指示本源程序结束。
         伪指令格式:
         END

ENTRY

ENTRY 伪指令用于指定程序的入口点。
         伪指令格式:
         ENTRY
         一个程序(可以包含多个源文件)中至少要有一个ENTRY,可以有多个ENTRY。但一个源文件中最多只有一个ENTRY。
         伪指令应用举例如下。
         AREA, Example, CODE,READNOLY
         ENTRY
         CODE32
         START MOV R1,#0x5F
         …

EQU

EQU 伪指令为数字常量,基于寄存器的值和程序中的标号定义一个名称。*与EQU同义。
         指令格式:
         name EQU expr{,type}
         其中:name 要定义的常量的名称。
         expr 基于寄存器的地址值,程序中的标号,32 位地址常量或32 位常量。
         type 当expr 为32 位常量时,可用type 指示expr 表示的数据类型。如下示例:
         CODE16
         CODE32
         DATA
         EQU 伪指令的作用类似于C 语言中的#define。用于为一个常量定义名称。
         伪指令应用举例如下:
         T_bit EQU 0x20 ;定义常量T_bit,其值为0x20
         PLLCON EQU 0xE01FC080 ;定义寄存器PLLCON,地址为0Xe01F080
         ABCD EQU label+8 ;定义ABCD 为label+8

EXPORT 和GLOBAL

EXPORT 声明一个符号可以被其它文件引用。相当于声明了一个全局变量。  GLOBAL 与EXPORT 相同
         指令格式:
         EXPORT symbol{[WEAK]}
         GLOBAL symbol{[WEAK]}
         其中:symbol 要声明的符号名称
         [WEAK] 声明其它的同名符优先于本符号被引用。
         伪指令应用举例如下:
         EXPORT InitStack
         GLOBAL Vectors

IMPORT 和EXTERN

IMJPORT 伪指令指示编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的,在本源文件中可能引用该符号。
         EXTERN 与IMPORT 相同
         指令格式:
         IMPORT symbol{[WEAK]}
         EXTERN symbol{[WEAK]}
         其中:symbol 要声明的符号名称。
         [WEAK] 指定该选项后,如果symbol 在所有的源程序中都没有被定义,编译器也不会生任何错误信息,同时编译器也不会到当前没有被INCLUDE 进来库中去查找该标号。
         使用IMPORT 或EXTERN 声明外部标号时,若连接器在连接处理时不能解释该符号,而伪指令中没有[WEAK]选项,则连接器会报告错误,若伪指令中有[WEAK]选项,则连接器不会报告错误,而是进行下面的操作:
         (A)如果该符号被B 或者BL 指令引用,则该符号被设置成下一条指令的地址,该B 或者BL 指令相当于一条NOP 指令。
         (B)其它情况下该符号被设置0。
         伪指令应用举例如下:
         IMPORT InitStack
         EXTERN Vectors

GET 和INCLUDE

GET 伪指令将一个源文件包含到当前源文件中,并将被包含的文件在当前位置进行汇编处理。INCLUDE 与GFT 同义。
         指令格式:
         GET filename
         INCLUDE filename
         其中:filename 要包含的源文件名,可以使用路径信息。
         GET 伪指令通常用于包含一些宏定义或常量定义的源文件。如用EQU 定义的常量,用MAP 和FIELD 定义的结构化的数据类型,这样的源文件类似于C 语言中的头文件,GET、INCLUDE 伪指令不能用来包含目标文件,而INCBIN 伪指令可以包含目标文件。
         伪指令应用举例如下:
         INCLUDE LPC2106.inc

INCBIN

INCBIN 伪指令将一个文件包含到当前源文件中,而被包含的文件不进行汇编处理。
         指令格式:
         INCBIN filename
         其中:filename 要包含的源文件名,可以使用路径信息。
         通常可以使用INCBIN 将一个执行文件或者任意数据包含到当前文件中,被包含的执行文件或数据将被原封不动地放下当前文件中,编译器从INCBIN 伪指令后面开始继续处理。
         伪指令应用举例如下:
         NCBIN charlib。bin

KEEP

KEEP 伪指令指示编译器保留符号表中的局部符号。
         伪指令格式:
         KEEP {symbol}
         其中:symbol 要保留的局部标号。若没有此项,则除了基于寄存器处的所有符号将包含在目标文件的符号表中。

NOFP

NOFP 伪指令用于禁止源程序中包含浮点运算指令。
         伪指令格式:
         NOFP

REQUIRE

REQUIRE 伪指令指定段之间的依赖关系。
         伪指令格式:
         REQUIRE label
         其中:label 所需要的标号的名称。
         当进行链接处理时,包含了REQUIRE label 伪指令的源文件,则定义label 的源文件也被包含。

PEQUIRE8 和PRESERVE8

PEQUIRE8 伪指令指示当前文件请求堆栈为8 字节对齐。
         PRESERVE8 伪指令指示当前文件保持堆栈为8 字节对齐。
         伪指令格式:
         PEQUIRE8
         PRESERVE8
         链接器保证要求8 字节对齐的堆栈只能被堆栈为8 字的对齐的代码调用

ARM汇编杂项伪指令相关推荐

  1. linux汇编伪指令大全,ARM汇编的伪指令(一)

    ARM汇编伪指令介绍 在ARM汇编语言程序里,有一些特殊的助记符,这些助记符与指令系统的助记符不同,没有相对应的操作码,这些特殊指令助记符被称为伪指令,他们所完成的操作称为伪操作.伪指令在源程序中的作 ...

  2. ARM汇编EQU伪指令

    EQU伪操作为数字常量,基于寄存器的值和程序中的标号定义一个字符名称."*"是EQU的同义词. 语法格式: name EQU EXPR{,type} 其中,name为expr定义的 ...

  3. ARM汇编指令立即数规范和判断

    转载 :https://blog.csdn.net/yunfenglw/article/details/41621103 在ARM汇编的数据处理指令中经常会使用到常数,而ARM汇编中规定使用的常数必须 ...

  4. ARM汇编伪指令介绍(全集)

    在ARM处理器汇编语言程序设计里,有一些特殊的指令助记符.这些助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊的指令助记符为伪指令,它们所完成的操作称为伪操作. 伪指令在源程序中的作用 ...

  5. 最全ARM汇编伪指令

    在ARM处理器汇编语言程序设计里,有一些特殊的指令助记符.这些助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊的指令助记符为伪指令,它们所完成的操作称为伪操作. 伪指令在源程序中的作用 ...

  6. linux 汇编 preserve8,ARM汇编伪指令

    分类: LINUX 2009-10-21 16:39:09 ARM 汇编程序的由机器指令,伪指令和宏指令组成.伪指令不像机器指令那样在处理器运行期间由机器执行,而是汇编程序对源程序汇编期间由汇编程序处 ...

  7. linux汇编伪指令大全,ARM汇编伪指令

    分类: LINUX 2009-10-21 16:39:09 ARM 汇编程序的由机器指令,伪指令和宏指令组成.伪指令不像机器指令那样在处理器运行期间由机器执行,而是汇编程序对源程序汇编期间由汇编程序处 ...

  8. c语言中 伪指令,ARM汇编伪指令介绍(1)

    ARM汇编伪指令介绍 在ARM汇编语言程序里,有一些特殊的助记符,这些助记符与指令系统的助记符不同,没有相对应的操作码,这些特殊指令助记符被称为伪指令,他们所完成的操作称为伪操作.伪指令在源程序中的作 ...

  9. 【嵌入式开发】 ARM 汇编 (指令分类 | 伪指令 | 协处理器访问指令)

    作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42408137  转载请著名出处 本博客相关文档下载 :  -- A ...

最新文章

  1. MySQL中同一时候存在创建和上次更新时间戳字段解决方法浅析
  2. windows7+visual studio 2013+CUDA7.5 编译caffe+配置matcaffe+配置pycaffe
  3. 手机访问服务器中的数据库文件,手机连接服务器数据库文件在哪里
  4. return另外一个用法
  5. 探测距离机器人模型:通过超声波测距控制舵机转向,LED灯,语音播放,蜂鸣器(米思齐mixly,arduino)
  6. 配置sharepoint的在多个域环境中的kerberos认证
  7. Oracle修改表空间为自动扩展
  8. Scala报错:error: overloaded method value logInfo with alternatives
  9. php高并发锁,redis锁,文件锁示例
  10. 分享一下免费的ppt网站(好看,免费)
  11. 过山车之星(Planet Coaster)的视角和编辑介绍
  12. 一元函数积分学的概念与性质
  13. Three.js - 透视相机(PerspectiveCamera)(三)
  14. 测试开发面试题160道17类21339字
  15. ”什么?穆冉不敢相信地看向穆大海
  16. c语言程序设计对角矩阵,从键盘输入一个4*4矩阵,并求这个4*4矩阵主对角线元素之和,并输出.球C语言程式设计...
  17. 世界经典咖啡@配制方法
  18. torch.save()模型的保存于加载
  19. Element Table 单元格中嵌套表格(Table) 合并行效果
  20. synergy /Applications/Synergy.app/contents/MacOS/synergy 没有权限问题

热门文章

  1. 基于 SpringBoot2.0+优雅整合 SpringBoot+Mybatis
  2. 2017-2018-1 20155209 《信息安全系统设计基础》第一周学习总结
  3. form表单的提交地址一定要是完整的绝对地址
  4. css3+js打造炫酷图片展示
  5. HTML 网页页面切换的各种变换效果
  6. Oracle 查找带有CLOB字段的所有表
  7. (转)基于MVC4+EasyUI的Web开发框架经验总结(13)--DataGrid控件实现自动适应宽带高度...
  8. WEB流程设计器 = jQuery + jsPlumb + Bootstrap
  9. PyTorch 1.0 中文文档:序列化的相关语义
  10. 笨办法学 Python · 续 练习 52:`moreweb`