首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

ARM指令集-伪指令

ARM指令集-伪指令

3.5  伪指令ARM编译器一般都支持汇编语言的程序设计和C/C++语言的程序设计,以及两者的混合编程。在ARM汇编语言程序,有一些特殊指令助记符,这些助记符与指令系统的助记不同,没有相对应的操作码,通常称这些特殊指令助记符为伪指令,他们所完成的操作称为伪操作。伪指令在源程序中的作用是为完成汇编程序作各种准备工作的,这些伪指令仅在汇编过程中起作用,一旦汇编结束,伪指令的使命就完成。
ARM的汇编程序中,有如下几种伪指令:ARM伪指令、符号定义伪指令数据定义伪指令、段定义伪指令、模块控制伪指令、汇编控制伪指令处理伪指令等等
需要特别指出的是,除了几条ARM伪指令以外,其它的伪指令依赖于编译器。也就是说,不同的ARM编译器的伪指令集是不相同的。例如,ADS编译器的段定义伪指令为AREA,而IAR编译器的段定义伪指令为RSEGASEG。这种情况使得不同编译器下编出的ARM汇编程序是不同的。读者在阅读不同学习材料时应注意分辨在不同编译器下ARM汇编程序的区别。
本书介绍的是IAR EWARM编译器支持的ARM汇编伪指令。
3.5.1  ARM伪指令ARM伪指令不是ARM指令集中的指令。它可以象其它ARM指令一样使用,但在编译时这些指令将被等效的ARM指令所取代。
1、LDR-大范围地址读取
LDR伪指令的格式为:
LDR{条件} reg,=expr/label_expr
reg为加载的目的寄存器;expr32位立即数;label_expr为地址表达式或外部表达式。
LDR伪指令将32位常量或一个32位地址加载到指定寄存器。
如:
LDR  R0=#0x12345        ;加载32位立即数0x12345到寄存器R0
LDR  R0=DATA_BUF+60    ;加载DATA_BUF地址+60
2、ADR-小范围地址读取
ADR伪指令的格式为:
ADR{条件} reg,expr
reg为加载的目的寄存器;expr为相对偏移表达式,非字对齐时取值范围为-255~255字节,字对齐时取值范围为-1020~1020字节。
ADR伪指令将基于当前PC相对偏移的地址值读取到寄存器中。
如:
Start: MOV R0#10
ADR R4start;相当于SUB R4PC#0x0c
3、ADRL-中范围地址读取
ADRL伪指令与ADR类似,不同在expr的取值范围,非字对齐时取值范围为64KB,字对齐时取值范围为256KB
4、NOP-空操作
3.5.2  数据定义伪指令1、DCB和DC8
该伪指令的格式为:
标号 DCB或DC8 表达式
DCBDC8伪指令用于分配一片连续的8位字节存储单元,并用伪指令中指定的表达式初始化。其中表达式可以为0255的数字或字符串。
如:
Str DCB “This is a test!” ;分配一个字符串,每个字符8位字节
2、DCW和DC16、DCD和DC32
DCBDC8用法相同,不同的是分别分配16位半字节单元和32位字单元。
3、DF32和DF64
分别表示32位的单精度浮点数和64位的双精度浮点数。
4、DS8、DS16、DS24和DS32
分别用于保留8位字节、16位半字、24位字和32位字的存储器空间。
如:
Dataspace DS8 100 ;保留1008位字节的存储器空间
返回列表