118 lines
1.6 KiB
PHP
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
|