ARM汇编杂项伪指令
杂项伪指令
杂项伪指令在汇编编程设计较为常用,如段定义伪指令,入口点设置伪指令,包含文件伪指令,标号导出或引入声明等,该类伪指令如下:
边界对齐: 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汇编杂项伪指令相关推荐
- linux汇编伪指令大全,ARM汇编的伪指令(一)
ARM汇编伪指令介绍 在ARM汇编语言程序里,有一些特殊的助记符,这些助记符与指令系统的助记符不同,没有相对应的操作码,这些特殊指令助记符被称为伪指令,他们所完成的操作称为伪操作.伪指令在源程序中的作 ...
- ARM汇编EQU伪指令
EQU伪操作为数字常量,基于寄存器的值和程序中的标号定义一个字符名称."*"是EQU的同义词. 语法格式: name EQU EXPR{,type} 其中,name为expr定义的 ...
- ARM汇编指令立即数规范和判断
转载 :https://blog.csdn.net/yunfenglw/article/details/41621103 在ARM汇编的数据处理指令中经常会使用到常数,而ARM汇编中规定使用的常数必须 ...
- ARM汇编伪指令介绍(全集)
在ARM处理器汇编语言程序设计里,有一些特殊的指令助记符.这些助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊的指令助记符为伪指令,它们所完成的操作称为伪操作. 伪指令在源程序中的作用 ...
- 最全ARM汇编伪指令
在ARM处理器汇编语言程序设计里,有一些特殊的指令助记符.这些助记符与指令系统的助记符不同,没有相对应的操作码,通常称这些特殊的指令助记符为伪指令,它们所完成的操作称为伪操作. 伪指令在源程序中的作用 ...
- linux 汇编 preserve8,ARM汇编伪指令
分类: LINUX 2009-10-21 16:39:09 ARM 汇编程序的由机器指令,伪指令和宏指令组成.伪指令不像机器指令那样在处理器运行期间由机器执行,而是汇编程序对源程序汇编期间由汇编程序处 ...
- linux汇编伪指令大全,ARM汇编伪指令
分类: LINUX 2009-10-21 16:39:09 ARM 汇编程序的由机器指令,伪指令和宏指令组成.伪指令不像机器指令那样在处理器运行期间由机器执行,而是汇编程序对源程序汇编期间由汇编程序处 ...
- c语言中 伪指令,ARM汇编伪指令介绍(1)
ARM汇编伪指令介绍 在ARM汇编语言程序里,有一些特殊的助记符,这些助记符与指令系统的助记符不同,没有相对应的操作码,这些特殊指令助记符被称为伪指令,他们所完成的操作称为伪操作.伪指令在源程序中的作 ...
- 【嵌入式开发】 ARM 汇编 (指令分类 | 伪指令 | 协处理器访问指令)
作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42408137 转载请著名出处 本博客相关文档下载 : -- A ...
最新文章
- MySQL中同一时候存在创建和上次更新时间戳字段解决方法浅析
- windows7+visual studio 2013+CUDA7.5 编译caffe+配置matcaffe+配置pycaffe
- 手机访问服务器中的数据库文件,手机连接服务器数据库文件在哪里
- return另外一个用法
- 探测距离机器人模型:通过超声波测距控制舵机转向,LED灯,语音播放,蜂鸣器(米思齐mixly,arduino)
- 配置sharepoint的在多个域环境中的kerberos认证
- Oracle修改表空间为自动扩展
- Scala报错:error: overloaded method value logInfo with alternatives
- php高并发锁,redis锁,文件锁示例
- 分享一下免费的ppt网站(好看,免费)
- 过山车之星(Planet Coaster)的视角和编辑介绍
- 一元函数积分学的概念与性质
- Three.js - 透视相机(PerspectiveCamera)(三)
- 测试开发面试题160道17类21339字
- ”什么?穆冉不敢相信地看向穆大海
- c语言程序设计对角矩阵,从键盘输入一个4*4矩阵,并求这个4*4矩阵主对角线元素之和,并输出.球C语言程式设计...
- 世界经典咖啡@配制方法
- torch.save()模型的保存于加载
- Element Table 单元格中嵌套表格(Table) 合并行效果
- synergy /Applications/Synergy.app/contents/MacOS/synergy 没有权限问题
热门文章
- 基于 SpringBoot2.0+优雅整合 SpringBoot+Mybatis
- 2017-2018-1 20155209 《信息安全系统设计基础》第一周学习总结
- form表单的提交地址一定要是完整的绝对地址
- css3+js打造炫酷图片展示
- HTML 网页页面切换的各种变换效果
- Oracle 查找带有CLOB字段的所有表
- (转)基于MVC4+EasyUI的Web开发框架经验总结(13)--DataGrid控件实现自动适应宽带高度...
- WEB流程设计器 = jQuery + jsPlumb + Bootstrap
- PyTorch 1.0 中文文档:序列化的相关语义
- 笨办法学 Python · 续 练习 52:`moreweb`