Addressing modes (immediate, register, offset) in ARM Architecture - Time & Space Complexity
We want to understand how the time it takes to access data changes when using different addressing modes in ARM assembly.
Specifically, how does the choice of immediate, register, or offset addressing affect the number of steps the processor takes?
Analyze the time complexity of the following ARM instructions using different addressing modes.
LDR R0, =0x1000 // Load immediate address
LDR R1, [R0] // Load from memory using register
LDR R2, [R0, #4] // Load from memory using offset
ADD R3, R1, R2 // Add values
This code loads a value from a fixed address, then loads another value from an address offset by 4 bytes, and finally adds them.
Look for repeated steps or memory accesses that take time.
- Primary operation: Memory load instructions (LDR) that access data.
- How many times: Each load happens once here, but in a loop these could repeat many times.
Imagine repeating these loads many times in a loop over data.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 20 memory loads and adds |
| 100 | About 200 memory loads and adds |
| 1000 | About 2000 memory loads and adds |
Pattern observation: The number of operations grows directly with the number of data items processed.
Time Complexity: O(n)
This means the time to complete the operations grows linearly as the number of data items increases.
[X] Wrong: "Using immediate addressing always makes the code run faster regardless of data size."
[OK] Correct: Immediate addressing loads fixed values quickly, but when accessing many data items, memory loads using register or offset addressing dominate time.
Understanding how different addressing modes affect execution time helps you write efficient assembly and shows you can think about performance at a low level.
"What if we replaced the offset addressing with register indirect addressing inside a loop? How would that affect the time complexity?"
Practice
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 AQuick Check:
Fixed number inside instruction = Immediate mode [OK]
- Confusing immediate with register mode
- Thinking offset mode uses fixed numbers directly
- Mixing indirect addressing with immediate
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 CQuick Check:
Register names without # or [] = Register mode [OK]
- Using # before register name
- Using brackets [] for register mode
- Confusing immediate and register syntax
LDR R2, [R3, #4], what does this instruction do?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 BQuick Check:
Offset mode loads from (R3 + 4) into R2 [OK]
- Thinking #4 is immediate load into R2
- Confusing load with store instruction
- Ignoring the offset in brackets
ADD R1, R2, #R3Solution
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 AQuick Check:
# only for constants, not registers [OK]
- Using # before register names
- Adding brackets unnecessarily
- Confusing immediate and register operands
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.Final Answer:
LDR R1, [R4, #8] ADD R0, R1, #5 -> Option DQuick Check:
Offset load then immediate add = LDR R1, [R4, #8] ADD R0, R1, #5 [OK]
- Mixing immediate and offset values incorrectly
- Using register instead of immediate for offset
- Loading directly into R0 then adding wrong offset
Ready to prove it?
Pass the test and this pattern moves unknown
