start:
  xor r0, r0, r0
  iload32 r2, r0, fibcount
  iset r0, 1
start_1:
  cmp r2, r0
  jc start_2

  push r0
  push r2
  mov r10, r0

  push r0
  call fib
  ispsub 1
  push r0
  push r1

  xor r3, r3, r3
  iload32 r1, r3, text1_len
  iset r0, text1_str
  call print_str

  mov r0, r10
  call print_uint32_dec

  xor r3, r3, r3
  iload32 r1, r3, text2_len
  iset r0, text2_str
  call print_str

  pop r1
  pop r0
  call print_uint64_dec
  call print_nl
  pop r2
  pop r0
  inc r0, r0, 1
  jmp start_1

start_2:
  xor r0, r0, r0
  xor r1, r1, r1
  syscall

fib:
  spget r0
  iload32 r0, r0, 8
  push r2
  push r3
  iset r2, 1
  xor r1, r1, r1
  cmp r0, r2
  jc fib_2
  jz fib_2
  dec r3, r0, 1
  push r3
  dec r0, r3, 1
  push r0
  call fib
  ispsub 1
  pop r2
  push r0
  push r1
  push r2
  call fib
  ispsub 1
  pop r3
  pop r2
  add r0, r0, r2
  adc r1, r1, r3
fib_2:
  pop r3
  pop r2
  ret

.text
fibcount:
    dw 50
text1_len:
    dw text1_end - text1_str
text1_str:
    db "Fib("
text1_end:
text2_len:
    dw text2_end - text2_str
text2_str:
    db ") = "
text2_end:
