;; rax contains the integer
;; rbx contains a pointer to the string buffer
itoa:
   ;; Special case for the number '0'
   cmp rax, 0
   jne .not_zero
   mov byte [rbx], '0'
   mov byte [rbx + 1], 0 
   ret

.not_zero:
   mov rdx, 0
   mov rcx, 100000
   div rcx
   add rax, '0'
   mov [rbx], al

   mov rax, rdx
   mov rdx, 0
   mov rcx, 10000
   div rcx
   add rax, '0'
   mov [rbx + 1], al

   mov rax, rdx
   mov rdx, 0
   mov rcx, 1000
   div rcx
   add rax, '0'
   mov [rbx + 2], al

   mov rax, rdx
   mov rdx, 0
   mov rcx, 100
   div rcx
   add rax, '0'
   mov [rbx + 3], al

   mov rax, rdx
   mov rdx, 0
   mov rcx, 10
   div rcx
   add rax, '0'
   mov byte [rbx + 4], al
   add dl, '0'
   mov byte [rbx + 5], dl

   ;; Time to shift everything left
   ;; End the current string with a null byte
   mov byte [rbx + 6], 0
.shift_left_loop:   
   cmp byte [rbx], '0'
   jne .done

   mov rcx, rbx
   inc rcx
   mov rdx, [rcx]
   and rdx, 255
   mov [rbx],     dx

   inc rcx
   mov rdx, [rcx]
   and rdx, 255
   mov [rbx + 1], dx

   inc rcx
   mov rdx, [rcx]
   and rdx, 255
   mov [rbx + 2], dx

   inc rcx
   mov rdx, [rcx]
   and rdx, 255
   mov [rbx + 3], dx

   inc rcx
   mov rdx, [rcx]
   and rdx, 255
   mov [rbx + 4], dx

   inc rcx
   mov rdx, [rcx]
   and rdx, 255
   mov [rbx + 5], dx

   jmp .shift_left_loop

.done:
   ret

;;; rdi should contain the address of a c-string
atoi:
	mov r8, rdi
	mov rax, 0
	mov rcx, 10

.lp:
	cmp byte [r8], 0
	jz .done
	mov r9, [r8]
	and r9, 127
	sub r9, '0'
	add rax, r9
	mov rcx, rax
	add rax, rax
	add rax, rax
	add rax, rax
	add rax, rcx
	add rax, rcx
	inc r8
	jmp .lp

.done:
	mov rcx, 10
	mov rdx, 0
	div rcx
	ret