PROWAREtech

articles » current » assembly » x86 » procedures » itoa

x86 Assembly: itoa Procedure

int to ASCII string - Convert Numbers to Strings.

Use MASM for Visual C++ Express Edition 2005 to compile this procedure.

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

.386P

.model FLAT

PUBLIC	_itoa_asm

_TEXT	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
_TEXT	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);'
.386P
.model FLAT

PUBLIC	_uitoa_asm

_TEXT	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
_TEXT ENDS
END

This site uses cookies. Cookies are simple text files stored on the user's computer. They are used for adding features and security to this site. Read the privacy policy.
CLOSE