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