; Fills specified buffer with the string representation of an integer value.
; This works just like the C function itoa, but with the exception of being
; fixed to a radix of 10.
;
; Parameters:
; - Value [ebp+8]
; - Buffer [ebp+12]
itoa:
push ebp
mov ebp, esp
mov ecx, [ebp+12] ; Buffer address goes in ecx.
xor edx, edx
mov eax, [ebp+8] ; Value goes in eax.
mov ebx, 10
div ebx ; Divide value by 10.
.loop
push ebx ; Store old decimal on the stack.
push edx ; Store old value on the stack
add edx, 0x30 ; Add offsset of ascii zer0.
mov eax, edx ; Move ascii value to eax.
mov edx, [ecx] ; Buffer goes in edx.
mov edi, edx
stosb ; Store a byte.
mov eax, 10 ; Time to multiply!
mul ebx ; eax is now ten times larger than ebx!
mov ebx, eax ; Set ebx to new decimal.
xor edx, edx
mov eax, [ebp+8] ; Value in eax.
div ebx ; Divide by current decimal in ebx, the remainder is used in edx.
pop eax ; Pop old value to eax.
sub edx, eax ; Subtract new value by old one.
pop eax ; Pop old decimal to eax.
push ebx ; Push current decimal.
mov ebx, edx ; Subtracted value goes in ebx.
push ebx ; Push edx onto stack.
push eax ; Push eax onto stack.
pop ebx ; Pop eax to ebx.
pop eax ; Pop ebx to eax.
xor edx, edx
div ebx ; Divide value in eax by old decimal.
inc ecx ; Move to next character
pop ebx ; Get back decimal from stack and put in ebx.
hlt
cmp eax, 0 ; See if this is the end.
jne .loop
mov edi, [ecx]
xor eax, eax ; Null terminate.
stosb ; Store null.
mov eax, [ebp+12] ; Set return value to buffer address.
leave
ret