You copied the Doc URL to your clipboard.

Register-relative and PC-relative expressions

The assembler supports PC-relative and register-relative expressions.

A register-relative expression evaluates to a named register combined with a numeric expression.

A PC-relative expression is written in source code as the PC or a label combined with a numeric expression. It can also be expressed in the form [PC, #number]. It is represented in the instruction as the PC value plus or minus a numeric offset. The assembler calculates the required offset from the address of the current instruction to the label. If the offset is too big, the assembler produces an error.

ARM recommends you write PC-relative expressions using labels rather than the PC because the value of the PC depends on the instruction set.

Note

  • In ARM state, the value of the PC is the address of the current instruction plus 8 bytes.

  • In Thumb state:

    • For B, BL, CBNZ, and CBZ instructions, the value of the PC is the address of the current instruction plus 4 bytes.

    • For all other instructions that use labels, the value of the PC is the address of the current instruction plus 4 bytes, with bit[1] of the result cleared to 0 to make it word-aligned.

Example

        LDR     r4,=data+4*n    ; n is an assembly-time variable
        ; code
        MOV     pc,lr
data    DCD     value_0
        ; n-1 DCD directives
        DCD     value_n         ; data+4*n points here
        ; more DCD directives

Related concepts

Related reference