1.3 KiB
1.3 KiB
ARM Subroutines
Subroutine, Function, Procedure
It has a single-entry and single-exit.
bl lbl- set
lrto the next instruction location - set
pcto the label
- set
bx lr- set
pcto the savedlr
- set
ARM register calling convention:
Passing Argument via registers:
mov r0, #3
mov r1, #4
bl ssq
mov r2, r0
b endl
SSQ:
mul r0, r0, r0
mul r1, r1, r1
add r0, r0, r1
bx lr
pc is always incremented by 4. Each time, 4 bytes are fetched from the instruction memory. It is not depending on instruction size (2 or 4 bytes).
Using Stack
Stack is a LIFO data structure.
push/pop
There is two stack growth convention:
- Ascending and Descending.
- Full and Empty
sp = r13
Coretex-M uses Full Descending stack.
commands
push {register_list}stmdb sp!, {register_list}pop {register_list}ldmia sp!, {register_list}
push instruction
push {Rd}
pop instruction
multi-level subroutines
main:
mov r0, #2
bl quad
quad:
push { lr }
bl sq
bl sq
pop { lr }
bx lr
sq:
mul r0, r0
bx lr
Initializing SP
Before using the stack, software has to define stack pointer
Recursive Function
No difference to multi-level subroutines.
It has multiple stack frames.