brainfuck_processor/assembly/complex_assembly.md

71 lines
1.7 KiB
Markdown

# Complex Assembly Functions
## Memory sections
1. Register Area
2. Stack
3. Open Memory
## Navigation between sections
- Compiler logs current position
- Registers can be navigated relative to zero index
## Registers
$r0 := 0 (constant to be replaced in code)
$r1 .. $r31 := all purpose registers
$io := Input/Output register (translates to read / write instruction)
$t1 .. $t8:= Registers to be used by the assembler only
## Register cell map
| cell | register | description |
| ---- | -------- | ---------------------------------- |
| 0 | $t1 | Start of hidden registers |
| 8 | $r1 | All purpose programmable registers |
| 40 | $mem | Random access memory |
## Add function
1. Store current position
2. Move to reg 1
3. move reg 1 into t1, t2
4. move t2 into reg 1
5. move to t1
6. move t1 to reg 2
7. return to starting position
### add $10 $11:
Setup: >>>>>>>>>>>>>>>>>>++++++++++>+++++<<<<<<<<<<<<<<<<<<<
Move to reg1: >>>>>>>>>>>>>>>>>> (move to operation)
Move reg 1 into t1, t2: [-<<<<<<<<<<<<<<<<<<+>+>>>>>>>>>>>>>>>>>] (reg1 to t1)
Move t2 into reg 1: <<<<<<<<<<<<<<<<<[->>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<] (reg1 to t2)
Move to t1: <
Move t1 to reg 2: [->>>>>>>>>>>>>>>>>>>+<<<<<<<<<<<<<<<<<<<] (t2 to reg2)
Optimization possible:
1. Moving reg1 to t1
2. Moving t1 to reg1 and reg2
3. Return to starting position
(Further optimization by checking the distances of reg1, reg2, t1 to avoid unnecessary steps)
### sub $5, $12
1. Move reg1 into t1
2. Move t1 into reg1, remove from reg2
while reg1:
reg1 --
t1 ++
### loop
Must store loop register and origin
Origin should be always the loop register inside loop
Old origin should be set on loopend