4.2.6. ADR

ADR 可将一个立即值与 pc 值相加,并将结果写入目标寄存器。

语法

ADR{cond}{.W} Rd,label

其中:

cond

是一个可选的条件代码(请参阅条件执行)。

.W

是可选的指令宽度说明符。 有关详细信息,请参阅Thumb-2 中的 ADR

Rd

是要加载的寄存器。

label

是一个程序相对的表达式。 有关详细信息,请参阅相对寄存器和程序相对的表达式

label 必须在当前指令的一定范围之内。 有关详细信息,请参阅偏移量范围和体系结构

用法

ADR 可生成与位置无关的代码,因为地址相对于程序或寄存器。

使用 ADRL 伪指令可汇编范围更大的有效地址(请参阅ADRL 伪指令)。

如果 label 相对于程序,则其值必须是与 ADR 指令处于同一汇编器区域的地址,请参阅AREA

如果使用 ADRBXBLX 指令生成目标,则当目标中包含 Thumb 指令时,您就要自己设置地址的 Thumb 位(位 0)。

偏移量范围和体系结构

汇编器会计算相对 PC 的偏移量。 如果 label 超出范围,则汇编器会生成错误。

Table 4.5 给出了标签和当前指令之间的可能的偏移量。

Table 4.6. 相对 PC 的偏移量

指令偏移量范围体系结构
ARM ADR请参阅Operand2 中的常数全部
32 位 Thumb ADR+/– 4095v6T2,v7
16 位 Thumb ADR [1]0-1020 [2]所有 T

[1] Rd 必须位于 r0-r7 范围之内。

[2] 必须是 4 的倍数。


Thumb-2 中的 ADR

可以使用 .W 宽度说明符强制 ADR 在 Thumb-2 代码中生成 32 位指令。带有 .WADR 始终生成 32 位指令,即使使用 16 位指令就可访问目标地址也如此。

对于向前引用,不带 .WADR 始终在 Thumb 代码中生成 16 位指令,即使这会导致无法访问可以使用 32 位 Thumb-2 ADD 指令生成的地址也如此。

Copyright © 2002-2008 ARM Limited. All rights reserved.ARM DUI 0204IC
Non-Confidential