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