adr

Form PC-relative Address (A32)

ADR<c> <Rd>, <label>

Adds an immediate value to the PC register.

Details

Computes the PC-relative address of a label and stores it in Rd. The address is calculated by adding an 12-bit immediate (rotated by an even number of bits) to PC. The assembler resolves the label to the appropriate immediate offset. The condition flags NZCV are not affected. This is an A32 instruction with conditional execution.

Pseudocode Operation

offset ← RotateImmediate(imm12)
Rd ← PC + offset

Example

ADR r0, label

Encoding

Binary Layout
cond
0010
100
0
1111
Rd
imm12
 
Format Data Proc
Opcode 0x028F0000
Extension A32 (Base)

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;