aoc_omni/fasm/lib/itoa.inc

90 lines
1.3 KiB
PHP

;; 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