add L7 and L8 pdf and complement in 1103
This commit is contained in:
86
notes/8.md
Normal file
86
notes/8.md
Normal file
@@ -0,0 +1,86 @@
|
||||
# ARM Subroutines
|
||||
|
||||
Subroutine, Function, Procedure
|
||||
|
||||
It has a single-entry and single-exit.
|
||||
|
||||
* `bl lbl`
|
||||
* set `lr` to the next instruction location
|
||||
* set `pc` to the label
|
||||
* `bx lr`
|
||||
* set `pc` to the saved `lr`
|
||||
|
||||
ARM register calling convention:
|
||||
|
||||
|
||||
|
||||
Passing Argument via registers:
|
||||
|
||||
```armasm
|
||||
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
|
||||
|
||||
```armasm
|
||||
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.
|
||||
BIN
pdf/L7.pdf
(Stored with Git LFS)
Normal file
BIN
pdf/L7.pdf
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
pdf/L8.pdf
(Stored with Git LFS)
Normal file
BIN
pdf/L8.pdf
(Stored with Git LFS)
Normal file
Binary file not shown.
Reference in New Issue
Block a user