Understanding ARM Addressing Modes: Immediate, Register, and Offset
📖 Scenario: You are learning how ARM processors access data in memory using different addressing modes. These modes help the processor find the right data quickly during program execution.Imagine you are organizing a small warehouse where items are stored in boxes. You can find an item by looking at a label directly (immediate), by checking a list that tells you which box to open (register), or by starting at a box and moving a few steps forward or backward (offset).
🎯 Goal: Build a simple ARM assembly snippet that demonstrates the three main addressing modes: immediate, register, and offset. This will help you understand how each mode works in practice.
📋 What You'll Learn
Create a register with a base address value
Create an immediate value to load into a register
Use register indirect addressing to load data
Use offset addressing to load data with an added offset
💡 Why This Matters
🌍 Real World
ARM processors are widely used in smartphones, tablets, and embedded devices. Understanding addressing modes helps in writing efficient low-level code and debugging.
💼 Career
Knowledge of ARM addressing modes is essential for embedded systems developers, firmware engineers, and anyone working with ARM assembly or low-level programming.
Progress0 / 4 steps
1
Set up base register and immediate value
Write ARM assembly code to create a register r0 with the base address value 0x1000 and load the immediate value 42 into register r1.
ARM Architecture
Hint
Use MOV instruction to load immediate values into registers.
2
Load data using register indirect addressing
Write ARM assembly code to load the value from the memory address stored in r0 into register r2 using register indirect addressing.
ARM Architecture
Hint
Use LDR with square brackets around the register to load from the address it holds.
3
Load data using offset addressing
Write ARM assembly code to load the value from the memory address at r0 plus an offset of 4 bytes into register r3 using offset addressing.
ARM Architecture
Hint
Use LDR with the base register and immediate offset inside the brackets.
4
Load data using register offset addressing
Write ARM assembly code to load the value from the memory address at r0 plus the offset stored in r1 into register r4 using register offset addressing.
ARM Architecture
Hint
Use LDR with the base register and register offset inside the brackets without a hash.
Practice
(1/5)
1. Which addressing mode uses a fixed number directly inside the instruction to provide data?
easy
A. Immediate addressing mode
B. Register addressing mode
C. Offset addressing mode
D. Indirect addressing mode
Solution
Step 1: Understand immediate addressing mode
Immediate mode means the instruction contains the actual number (constant) to use.
Step 2: Compare with other modes
Register mode uses CPU registers, offset mode calculates address by adding offset to a register, indirect mode uses memory address stored in a register.
Final Answer:
Immediate addressing mode -> Option A
Quick Check:
Fixed number inside instruction = Immediate mode [OK]
Hint: Immediate mode has the number right inside the instruction [OK]
Common Mistakes:
Confusing immediate with register mode
Thinking offset mode uses fixed numbers directly
Mixing indirect addressing with immediate
2. Which of the following is the correct syntax for using register addressing mode in ARM assembly to move data from register R1 to R0?
easy
A. MOV R0, [R1]
B. MOV R0, #R1
C. MOV R0, R1
D. MOV [R0], R1
Solution
Step 1: Understand register addressing syntax
Register addressing uses register names directly without # or brackets.
Step 2: Analyze options
MOV R0, R1 uses MOV R0, R1 which copies data from R1 to R0 correctly. MOV R0, #R1 wrongly uses # which means immediate. MOV R0, [R1] uses brackets which means memory access. MOV [R0], R1 tries to move to memory location incorrectly.
Final Answer:
MOV R0, R1 -> Option C
Quick Check:
Register names without # or [] = Register mode [OK]
Hint: Register mode uses register names directly, no # or brackets [OK]
Common Mistakes:
Using # before register name
Using brackets [] for register mode
Confusing immediate and register syntax
3. Given the ARM instruction LDR R2, [R3, #4], what does this instruction do?
medium
A. Loads the immediate value 4 into R2
B. Loads the value from memory address in R3 plus 4 into R2
C. Moves the value from R3 to R2
D. Stores the value of R2 into memory address R3 plus 4
Solution
Step 1: Identify addressing mode in LDR instruction
The syntax [R3, #4] means offset addressing mode: base register R3 plus immediate offset 4.
Step 2: Understand LDR operation
LDR loads data from memory address calculated by R3 + 4 into register R2.
Final Answer:
Loads the value from memory address in R3 plus 4 into R2 -> Option B
Quick Check:
Offset mode loads from (R3 + 4) into R2 [OK]
Hint: Brackets with # offset means load from memory address plus offset [OK]
Common Mistakes:
Thinking #4 is immediate load into R2
Confusing load with store instruction
Ignoring the offset in brackets
4. Identify the error in this ARM instruction using addressing modes: ADD R1, R2, #R3
medium
A. Incorrect use of # before register R3
B. Missing brackets around R3
C. Wrong destination register
D. Immediate value cannot be used with ADD
Solution
Step 1: Analyze the use of # in ARM instructions
The # symbol is used only before immediate (constant) values, not registers.
Step 2: Check the instruction syntax
Here #R3 is invalid because R3 is a register, not an immediate value. Correct syntax is ADD R1, R2, R3 without #.
Final Answer:
Incorrect use of # before register R3 -> Option A
Quick Check:
# only for constants, not registers [OK]
Hint: # is only for numbers, never before register names [OK]
Common Mistakes:
Using # before register names
Adding brackets unnecessarily
Confusing immediate and register operands
5. You want to load a value from memory address calculated by adding 8 to the value in register R4, then add an immediate value 5 to it and store in R0. Which sequence of ARM instructions correctly uses addressing modes?
hard
A. LDR R1, [R4, R5]
ADD R0, R1, #8
B. LDR R0, [R4, #5]
ADD R0, R0, #8
C. LDR R0, [R4]
ADD R0, R0, R5
D. LDR R1, [R4, #8]
ADD R0, R1, #5
Solution
Step 1: Load from memory address R4 + 8
Use offset addressing mode: LDR R1, [R4, #8] loads from address R4 + 8 into R1.
Step 2: Add immediate 5 to loaded value
ADD R0, R1, #5 adds immediate 5 to R1 and stores result in R0.