bin2fdec -padding pour faire 12 caractères
comme les codes precedement postés ici, ceci est un aide mémoire.
celui ci couvre le code necessaire à la convertion d'un nombre decimal en une chaine de caractères terminée par 0.
l'algo est de mise en oeuvre super simple, et permet entre autre de faire dans la virgule fixe, et la virgule flottante (avec des adaptations evidement).
la chaine de base, ici str db "0000.000", contient un point décimal permettant d'interpreter eax en tant que valeur en virgule fixe, à 3 decimales apres la virgule.
Code:
1 2 3 4 5 6 7 8
|
mov eax,[valeur]
mov ebx,str.end
mov edi,str
call fixeddecimal
;ebx = chaine de caractère
mov eax,ebx
call printf ;afficher la chaine pointée par eax |
la structure invoquée par cette fonction est comme suit:
Code:
1 2 3 4
|
valeur dd ?
str db "0000.000"
.end db 0 |
et enfin, la fonction en elle même
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
fixeddecimal:
mov ecx,10
.loop:
dec ebx
cmp byte[ebx],'.'
jne @f
dec ebx
@@:
cmp ebx,edi
jl .end
xor edx,edx
div ecx
or edx,edx
jne @f
or eax,eax
jne @f
mov dl,' '-'0'
@@:
add dl,'0'
mov [ebx],dl
jmp .loop
.end:
ret |
Vous voyez, ce n'est pas bien compliqué.
Et si l'on veut juste un nombre sans point décimal, il suffit de ne pas déclarer de point dans la chaine de destination.
Personnelement, j'utilise cette fonction pour toutes les conversions binaire vers décimal, avec ou sans virgule fixe.
l'avantage est certain car il permet de n'avoir qu'une seule fonction pour ces deux actions.
pour la virgule flottante, il y aura donc lieu de proceder à une conversion.
tou d'abord, determiner la position de la virgule avec la FPU (ou SSE), multiplier par la puissance necessaire à la disparition de la virgule. et enfin, convertir en binaire (fist)
suite à ça, il y aura lieu de creer la chaine de reception, avec le point decimal à la bonne position, et le tour est joué.
il est aussi possible, à moindre frais, d'utiliser le format BCD de la FPU pour charger directement un nombre décimal, et juste extraire chaque nibble, puis aditionner la valeur du "0" ascii, et enfin, l'envoyer dans la chaine.