PROWARE technologies
PROWARE technologies

itoa - Convert Numbers to Characters in x86 Assembly

Use the itoa_asm procedure to convert an integer to a C-string. To convert a C-string to an integer, use atoi_asm (ASCII to int).

TITLE 'extern "C" void itoa_asm(int val, char *sz, unsigned radix);'
.686

.model FLAT

PUBLIC	_itoa_asm

_INTTOALPHA	SEGMENT
_itoa_asm	PROC NEAR

	mov  ecx, DWORD PTR [esp+8] ; sz
	push ebx
	push ebp

; if radix equals 10 and val is a negative number

	mov  ebp, DWORD PTR [esp+20] ; radix
	cmp  ebp, 10
	push esi
	mov  esi, DWORD PTR [esp+16] ; val
	push edi
	jne  SHORT label1
	test esi, esi
	jge  SHORT label1

	mov  BYTE PTR [ecx], 45 ; '-'
	inc  ecx

	neg  esi
	
label1:

	mov  edi, ecx

label2:

	xor  edx, edx
	mov  eax, esi
	div  ebp

	mov  eax, esi
	mov  ebx, edx
	xor  edx, edx
	div  ebp

	cmp  ebx, 9
	mov  esi, eax
	jbe  SHORT label3

	add  bl, 55 ; 'A' - 10

	jmp  SHORT label4
	
label3:

	add  bl, 48 ; '0'

label4:

	mov  BYTE PTR [ecx], bl
	inc  ecx

	test esi, esi
	ja   SHORT label2

; terminate string

	mov  BYTE PTR [ecx], 0
	dec  ecx

label5:

; reverse string

	mov  dl, BYTE PTR [edi]
	mov  al, BYTE PTR [ecx]
	mov  BYTE PTR [ecx], dl
	dec  ecx
	mov  BYTE PTR [edi], al
	inc  edi
	cmp  edi, ecx
	jb   SHORT label5

	pop  edi
	pop  esi
	pop  ebp
	pop  ebx

	ret  0
	
_itoa_asm	ENDP
_INTTOALPHA	ENDS
END

Use the uitoa_asm procedure to convert an unsigned integer to a C-string. To convert a C-string to a positive number, use atoui_asm (ASCII to uint).

TITLE 'extern "C" void uitoa_asm(unsigned int val, char *sz, unsigned radix);'
.686
.model FLAT

PUBLIC	_uitoa_asm

_UNSIGNEDINTTOALPHA	SEGMENT
_uitoa_asm	PROC NEAR

	push ebx
	push ebp

	mov  ebp, DWORD PTR [esp+20] ; radix
	push esi
	mov  esi, DWORD PTR [esp+20] ; sz
	push edi
	mov  edi, DWORD PTR [esp+20] ; val
	mov  ebx, esi

label1:

	xor  edx, edx
	mov  eax, edi
	div  ebp

	mov  eax, edi
	mov  ecx, edx
	xor  edx, edx
	div  ebp


	cmp  ecx, 9
	mov  edi, eax
	jbe  SHORT label2


	add  cl, 55 ; 'A' - 10

	jmp  SHORT label3

label2:

	add  cl, 48 ; '0'

label3:

	mov  BYTE PTR [esi], cl
	inc  esi

	test edi, edi
	ja   SHORT label1

; terminate string

	mov  BYTE PTR [esi], 0
	dec  esi

label4:

; reverse string

	mov  cl, BYTE PTR [ebx]
	mov  al, BYTE PTR [esi]
	mov  BYTE PTR [esi], cl

	dec  esi
	mov  BYTE PTR [ebx], al

	inc  ebx

	cmp  ebx, esi
	jb   SHORT label4

	pop  edi
	pop  esi
	pop  ebp
	pop  ebx

	ret  0

_uitoa_asm	ENDP
_UNSIGNEDINTTOALPHA	ENDS
END