adr
Form PC-relative Address (Thumb)
ADR <Rd>, <label>
Adds an immediate value to the PC (Thumb).
Details
Computes a PC-relative address by adding an 8-bit immediate (shifted left by 2) to the aligned PC and writes the result to a register. No condition flags are affected. This Thumb 16-bit instruction is available in all Thumb-capable processors.
Pseudocode Operation
Rd ← Align(PC, 4) + (imm8 << 2)
Example
ADR r0, label
Encoding
Binary Layout
1010
0
Rd
imm8
Operands
-
Rd
Destination general-purpose register -
label
Label
Reference (Arm AArch32 ISA)
Instruction Forms
| Encoding | Instruction | ISA | Bit pattern | ||
|---|---|---|---|---|---|
| 0x028F0000 | ADR{<c>}{<q>} <Rd>, <label> | A32 | cond | 0010 | 100 | 0 | 1111 | Rd | imm12 | ||
| 0x024F0000 | ADR{<c>}{<q>} <Rd>, <label> | A32 | cond | 0010 | 010 | 0 | 1111 | Rd | imm12 | ||
| 0xA000 | ADR{<c>}{<q>} <Rd>, <label> | T32 | 1010 | 0 | Rd | imm8 | ||
| 0xF2AF0000 | ADR{<c>}{<q>} <Rd>, <label> | T32 | 11110 | i | 10 | 1 | 0 | 1 | 0 | 1111 | 0 | imm3 | Rd | imm8 | ||
| 0xF20F0000 | ADR{<c>}.W <Rd>, <label> | T32 | 11110 | i | 10 | 0 | 0 | 0 | 0 | 1111 | 0 | imm3 | Rd | imm8 |
Description
Form PC-relative address adds an immediate value to the PC value to form a PC-relative address, and writes the result to the destination register.
Operation
if ConditionPassed() then
EncodingSpecificOperations();
result = if add then (Align(PC,4) + imm32) else (Align(PC,4) - imm32);
if d == 15 then // Can only occur for A32 encodings
ALUWritePC(result);
else
R[d] = result;