微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM汇编常用伪操作总结

ARM汇编常用伪操作总结

时间:11-29 来源:互联网 点击:

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] 指定这个选项后,如果符号在所有的源文件中都没有定义,编

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top