armasm supports PC-relative and register-relative
A register-relative expression evaluates to a named register combined with a numeric expression.
You write a PC-relative expression in source code as a label
or the PC, optionally combined with a numeric expression. Some instructions
can also accept PC-relative expressions in the form
If you specify a label, the assembler calculates the offset from the PC value of the current instruction to the address of the label. The assembler encodes the offset in the instruction. If the offset is too large, the assembler produces an error. The offset is either added to or subtracted from the PC value to form the required address.
ARM recommends you write PC-relative expressions using labels rather than PC because the value of PC depends on the instruction set.
In A32 code, the value of the PC is the address of the current instruction plus 8 bytes.
In T32 code:
CBZinstructions, 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 of the result cleared to 0 to make it word-aligned.
In A64 code, the value of the PC is the address of the current instruction.
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