Concept Flow - Stack pointer (R13/SP)
Start Program
Initialize SP (R13)
Push Data
→SP = SP - 4
Pop Data
→Load Data from SP
End Program
The stack pointer (R13/SP) tracks the top of the stack. It moves down when pushing data and up when popping data.
MOV R13, #0x1000 ; Initialize SP
PUSH {R0} ; Push R0 onto stack
POP {R1} ; Pop top of stack into R1| Step | Instruction | SP (R13) Value | Action | Stack Memory State |
|---|---|---|---|---|
| 1 | MOV R13, #0x1000 | 0x1000 | Initialize SP to 0x1000 | Empty |
| 2 | PUSH {R0} | 0x0FFC | SP decremented by 4; R0 stored at 0x0FFC | 0x0FFC: R0 value |
| 3 | POP {R1} | 0x1000 | R1 loaded from 0x0FFC; SP incremented by 4 | Empty |
| Variable | Start | After Step 1 | After Step 2 | After Step 3 |
|---|---|---|---|---|
| SP (R13) | Undefined | 0x1000 | 0x0FFC | 0x1000 |
| Stack Memory | Empty | Empty | 0x0FFC: R0 value | Empty |
| R0 | ValueX | ValueX | Stored on stack | ValueX |
| R1 | Undefined | Undefined | Undefined | ValueX (popped) |
Stack pointer (R13/SP) holds the address of the top of the stack. Pushing data decreases SP (stack grows down). Popping data increases SP (removes data). SP must be initialized before use. SP points to the last pushed data location.
SUB SP, SP, #4 STR R0, [SP] ADD SP, SP, #4
ADD SP, SP, #8 LDR R1, [SP, #-4]
Pass the test and this pattern moves unknown