1.7 KiB
Complex Assembly Functions
Memory sections
- Register Area
- Stack
- 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
- Store current position
- Move to reg 1
- move reg 1 into t1, t2
- move t2 into reg 1
- move to t1
- move t1 to reg 2
- 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:
- Moving reg1 to t1
- Moving t1 to reg1 and reg2
- Return to starting position
(Further optimization by checking the distances of reg1, reg2, t1 to avoid unnecessary steps)
sub $5, $12
- Move reg1 into t1
- 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