|Home > Writing A32/T32 Assembly Language > Load addresses to a register using ADR|
ADR instruction loads an address within a certain range, without performing a data load.
ADR accepts a PC-relative expression, that is, a label with an optional
offset where the address of the label is relative to the PC.
ADRmust be within the same code section. The assembler faults references to labels that are out of range in the same section.
The available range of addresses for the
ADR instruction depends on the
instruction set and encoding:
must be word-aligned. You can use the
ALIGNdirective to ensure this.
This example shows A32 code that implements a jump
table. Here, the
ADR instruction loads the address of the
AREA Jump, CODE, READONLY ; Name this block of code ARM ; Following code is A32 code num EQU 2 ; Number of entries in jump table ENTRY ; Mark first instruction to execute start ; First instruction to call MOV r0, #0 ; Set up the three arguments MOV r1, #3 MOV r2, #2 BL arithfunc ; Call the function stop MOV r0, #0x18 ; angel_SWIreason_ReportException LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit SVC #0x123456 ; AArch32 semihosting (formerly SWI) arithfunc ; Label the function CMP r0, #num ; Treat function code as unsigned ; integer BXHS lr ; If code is >= num then return ADR r3, JumpTable ; Load address of jump table LDR pc, [r3,r0,LSL#2] ; Jump to the appropriate routine JumpTable DCD DoAdd DCD DoSub DoAdd ADD r0, r1, r2 ; Operation 0 BX lr ; Return DoSub SUB r0, r1, r2 ; Operation 1 BX lr ; Return END ; Mark the end of this file
In this example, the function
arithfunc takes three arguments and returns
a result in
R0. The first argument determines the operation to be carried
out on the second and third arguments:
The jump table is implemented with the following instructions and assembler directives:
is used elsewhere in the code, the value 2 is substituted. Using
EQUin this way is similar to using
#defineto define a constant in C.
DCDstores the address of a routine that handles a particular clause of the jump table.
LDR PC,[R3,R0,LSL#2] instruction loads the address of the
required clause of the jump table into the PC. It:
R0by 4 to give a word offset.