Conversion entier -> chaine de caracteres

Soyez le premier à donner votre avis sur cette source.

Snippet vu 11 421 fois - Téléchargée 29 fois

Contenu du snippet

cette fonction ecrite en asm, englobée dans une structure de programme C permet de convertir un entier signé (positif ou non) en sa représentation sous forme de chaine de caractères.

Source / Exemple :


#include <malloc.h>

char *int32tochar(int n){
	char *ret_buf = (char *)calloc(12,1);
	char buf[12]={0};
	char sign=0;

	__asm{
			mov ebx,n
			mov eax,n
			shr eax,31					// on va ne garder que le bit de poids
			cmp eax,1					// le plus fort, celui qui donne le signe
			jnz not_signed_1
			mov sign,1

not_signed_1:
			mov ecx,10					// le diviseur reste fixe a 10
			xor edi,edi

while_ebx_not_0:
			mov eax,ebx
			cmp sign,1					// si l'entier est signe on a pas besoin de mettre les
			jnz not_signed_2			// bits de edx a 1
			mov edx,0xFFFFFFFF
			idiv ecx					// on divise le nombre de 64bits [edx-eax] par ecx
			xor dl,0xFF					// le reste va dans edx, le quotient dans eax
			inc dl						// on convertit le reste en unsigned par un complement a 2 +1
			jmp suite_div

not_signed_2:
			xor edx,edx					// si l'entier est non signé, on met tous les bits de edx a 0
			div ecx						// div est fait comme idiv une division mais sur des non signes

suite_div:
			add dl,'0'
			mov byte ptr[buf+edi],dl	// on remplit le tableau
			inc edi
			mov ebx,eax					// le quotient repars dans le nombre qui va subir
			cmp ebx,0					// d'autres divisions
			jnz while_ebx_not_0
			cmp sign,1					// si l'entier est signe on rajoute le signe -
			jnz end_convert_proc
			mov byte ptr[buf+edi],'-'
			inc edi

end_convert_proc:						// a partir de la commence la procedure d'inversion
			dec edi						// de la chaine
			mov esi,edi
			mov edi,ret_buf

while_al_not_0:
			mov al,byte ptr[buf+esi]
			mov byte ptr[edi],al
			dec esi
			inc edi
			cmp esi,0
			jnz while_al_not_0
	}

	return ret_buf;
}

Conclusion :


si vous avez des suggestions pour améliorer ce code, ben dite le

A voir également

Ajouter un commentaire

Commentaires

gg00xiv
Messages postés
656
Date d'inscription
mercredi 22 août 2001
Statut
Membre
Dernière intervention
11 mars 2005
12 -
euh, je pense que la coloration syntaxique ne fonctionne pas, ou mal, donc faites simplement un copier coller, vous retrouverer la bonne indentation
gblade
Messages postés
85
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
19 mai 2003
-
euh tu dis que pr determiner le signe on isole le bit de poid le plus fort, mais je croyais que les negatifs etaient formes par complement a 2 ??
gg00xiv
Messages postés
656
Date d'inscription
mercredi 22 août 2001
Statut
Membre
Dernière intervention
11 mars 2005
12 -
tu m'excusera mais je vois pas trop le rapport entre ta remarque et mon programme. Enfin, pour ton information le bit de poids le plus fort dans un nombre signé est toujours à 1.
gblade
Messages postés
85
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
19 mai 2003
-
ct juste une question, mais bon le fait de dire que le programme convertit un entier signe ou non ca porte a confusion
en fait ton programme convertit tous les entiers signes negatifs ou positifs et non les entiers non signes
pr moi un entier signe n'est pas forcemment negatif
c vrai qu'en ASM ya pas de difference entre un entier non signe et un entier signe positif ds la mesure ou celui ci ne depasse pas la moitie de la capacite mais prenons exemple sur le C, un unsigned int peut prendre la valeur 0xffffffff sans pour autant qu'il soit negatif. de meme si je declare un int et que je lui affecte la valeur 0x00000001 le bit de poid le + fort ne sera pas à 1 et pourtant mon nombre est signé puisque int sous entend signed int.
enfin de ttefacon c de ma faute, g mal regarde la declaration de ta fonction c int32tochar(int)
gg00xiv
Messages postés
656
Date d'inscription
mercredi 22 août 2001
Statut
Membre
Dernière intervention
11 mars 2005
12 -
effectivement je me suis mal exprimer, la fonction prends en parametre un entier signé toujours (int).

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.