begin process at 2012 05 24 02:29:19
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

c et asm

 > CONVERSION ENTIER -> CHAINE DE CARACTERES

CONVERSION ENTIER -> CHAINE DE CARACTERES


 Information sur la source

Note :
Aucune note
Catégorie :c et asm Niveau :Débutant Date de création :17/11/2002 Date de mise à jour :24/11/2002 15:04:16 Vu :9 251

Auteur : gg00xiv

Ecrire un message privé
Site perso
Commentaire sur cette source (6)
Ajouter un commentaire et/ou une note

 Description

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

  • #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;
  • }
#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


 Sources de la même categorie

INTERFACE C ET ASM par parki
Source avec Zip Source avec une capture FONCTION INTTOBIN par Ken21
Source avec Zip MOT PALINDROME par Tinsalhi
EXECUTE /USR/BIN/ID par 0x0syscall
BIBLIOTHEQUE POUR LE 8086 par flory_

Commentaires et avis

Commentaire de gg00xiv le 17/11/2002 22:42:53

euh, je pense que la coloration syntaxique ne fonctionne pas, ou mal, donc faites simplement un copier coller, vous retrouverer la bonne indentation

Commentaire de gblade le 22/11/2002 22:53:23

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

Commentaire de gg00xiv le 24/11/2002 12:27:16

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.

Commentaire de gblade le 24/11/2002 13:07:20

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)

Commentaire de gg00xiv le 24/11/2002 15:03:09

effectivement je me suis mal exprimer, la fonction prends en parametre un entier signé toujours (int).

Commentaire de gg00xiv le 24/11/2002 15:04:45

je viens de corriger l'entete de ce post

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,806 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales