aoc_omni/fasm/lib/itoa.inc
2023-12-21 11:45:43 -05:00

118 lines
1.6 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
;;; 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