Skip to main content

Section 11.1 Addressing Modes

The ARM instruction set architecture is a Load/Store architecture, which means that data values must be loaded into CPU registers before arithmetic or logic operations can be performed on them. The instructions that load data values from memory, or store data values in memory cannot alter the value.

Instructions that operate on data in registers follow the general pattern:

operation_code    destination_register, source_register(s)

The load instructions follow a similar pattern:

load              destination_register, source_memory_address

But “source” and “destination” are reversed in the pattern of the store instructions:

store             source_register, destination_memory_address

The CPU determines the memory address for a load or store by adding a positive or negative offset to a value in a base register. The way in which the CPU combines these two parts is called the Addressing Mode. The ARM instruction set architecture has three addressing modes:

Immediate

The offset is an unsigned integer that is stored as part of the instruction. It can be added to or subtracted from the value in the base register. If a label is used to specify the address, the assembler uses the pc as the base register and computes the appropriate offset.

Register

The offset is an unsigned integer that is in a register other than the pc. It can be added to or subtracted from the value in the base register.

Scaled Register

The offset is an unsigned integer that is in a register other than the pc. It is shifted by an immediate amount before it is added to or subtracted from the value in the base register.

These addressing modes can affect the value in the base register in three different ways:

Offset

The value in the base register is unchanged.

Pre-indexed

The offset is combined with the value in the base register, and the base register is updated with this new address before being used to access memory.

Post-indexed

The value in the base register alone is used to access memory. Then the the offset is combined with the value in the base register, and the base register is updated with this new address after accessing memory.

The variants of these addressing schemes, and the allowable immediate values, differ between instructions. You need to read the description of each instruction to know what it supports.