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
  push r4
  push r5
  push r6
  push r7
  iset r2, 1
  xor r1, r1, r1
  cmp r0, r2
  jc fib_end
  jz fib_end
  mov r3, r0
  xor r4, r4, r4
  xor r5, r5, r5
  iset r0, 1
fib_1:
  add r6, r0, r4
  adc r7, r1, r5
  mov r4, r0
  mov r5, r1
  mov r0, r6
  mov r1, r7
  inc r2, r2, 1
  cmp r3, r2
  jnz fib_1
fib_end:
  pop r7
  pop r6
  pop r5
  pop r4
  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:
