aoc_omni/fasm/lib/itoa.inc

90 lines
1.3 KiB
PHP
Raw Normal View History

;; rax contains the integer
;; rbx contains a pointer to the string buffer
itoa:
2023-12-21 09:40:11 -05:00
;; Special case for the number '0'
cmp rax, 0
jne .not_zero
2023-12-21 10:10:30 -05:00
mov byte [rbx], '0'
2023-12-21 09:40:11 -05:00
mov byte [rbx + 1], 0
ret
.not_zero:
2023-12-21 10:10:30 -05:00
mov rdx, 0
mov rcx, 100000
div rcx
add rax, '0'
mov [rbx], al
2023-12-21 09:49:14 -05:00
2023-12-21 10:10:30 -05:00
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
2023-12-21 09:40:11 -05:00
2023-12-21 10:10:30 -05:00
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
2023-12-21 09:40:11 -05:00
;; 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