伪指令支持ARM伪指令

本文参考地址:10.2 ARM汇编器支持的伪指令

ARM 汇编器支持 ARM 伪指令arm汇编指令中的变量,这些伪指令在汇编阶段被翻译成 ARM 或 Thumb(或 Thumb-2) 指令(或指令序列))。ARM 伪指令包括 ADR、ADRL、MOV32 和 LDR。

• ADR 伪指令将程序相对(-) 或寄存器相对(-) 地址(一小部分地址)加载到寄存器中。

• ADRL 伪指令将程序相对(-) 或寄存器相对(-) 地址(中间地址)加载到寄存器中。

MOV32 将 32 位常量或地址加载到寄存器中(架构及以上支持)。

· LDR 将 32 位常量或地址加载到寄存器中(所有 ARM 版本都支持)。

10.2.1ADR 伪指令

(1) 语法格式

ADR 是小范围地址读取的伪指令。ADR伪指令将PC相对偏移地址或寄存器相对偏移地址值读入寄存器。地址值按字节对齐时arm汇编指令中的变量,取值范围为-255~255。地址值按字对齐时,取值范围为-1020~1020。地址值按16字节对齐时,取值范围更大。

语法格式如下。

ADR{cond}{.W},标签

①条件

可选指令执行条件。

②.W

选修的。指定指令宽度(受 Thumb-2 指令集支持)。

目的地寄存器。

④标签

基于 PC 的或带有寄存器的表达式。

(2)使用说明

ADR 由汇编器编译成一条指令。汇编器通常使用 ADD 或 SUB 指令来实现伪操作地址加载功能。如果一条指令不能用于实现 ADR 伪指令的功能,汇编器将报告错误。

(3)示例

LDRr4,=data+4*n ;n为汇编时生成的变量

;代码

MOVpc,lr

;n-1 DCD 伪操作

;要加载到 r4 中的值

; 更多 DCD 伪操作

10.2.2ADRL 伪指令

(1) 语法格式

ADRL 是中间地址读取伪指令。ADRL伪指令将根据PC的相对偏移量的地址或根据寄存器的相对偏移量的地址值读入寄存器。地址值字节对齐时,取值范围为 −64KB 到 64KB。当地址值是字对齐时,在 -256KB 到 256KB 的范围内。当地址值是 16 字节对齐时,它的取值范围更大。在 32 位 Thumb-2 指令中,地址值范围达到 ±1MB。

注意

ADRL 只能用于 ARM 汇编或 Thumb-2 汇编,Thumb 汇编器不支持 ADRL 伪指令。

语法格式如下。

ADRL{cond},标签

①条件

可选指令执行条件。

目的地寄存器。

③标签

PC 或特定的基于寄存器的表达式。

(2)使用说明

ADRL 伪指令类似于 ADR 伪指令,用于将 PC 相对偏移地址或寄存器相对偏移地址值读入寄存器。不同之处在于 ADRL 指令可以读取比 ADR 指令更广泛的地址。这是因为 ADRL 指令在编译阶段被编译器替换为两条指令。即使一条指令可以完成这项工作,编译器也会产生两条指令,其中一条是多余的。如果汇编器不能在两条指令内完成操作,就会报错并中止编译。

注意

如果使用 ADRL 指令加载标签地址,则要加载的标签必须与 ADRL 指令在同一段中。

10.2. 伪指令

(1) 语法格式

MOV32 伪指令将 32 位常量或地址加载到寄存器中。

与 ADR 和 ADRL 指令不同,MOV32 伪指令加载的地址是位置相对地址。

语法格式如下。

MOV32{cond}, expr

①条件

可选指令执行条件。

目的地寄存器。

③表达式

表达式可以是以下形式。

·:程序中定义的标签地址。

·:任何 32 位常数。

·+:地址标签加32位常数。

(2)使用说明

通常,汇编器将 MOV32 伪指令翻译成一对 MOV 和 MOVT 指令。这样,任何 32 位常量都可以加载到寄存器中。

注意

该方法加载的程序地址是在程序被链接时由链接器确定的,是一个位置相关的地址。

图片[1]-伪指令支持ARM伪指令-4747i站长资讯

文章来源:http://www.eepw.com.cn/article/257047.htm

------本页内容已结束,喜欢请分享------

感谢您的来访,获取更多精彩文章请收藏本站。

© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享