cs_Nasman
Messages postés
202
Date d'inscription
mardi 17 mai 2005
Statut
Membre
Dernière intervention
29 septembre 2008
3
21 avril 2006 à 08:36
Bonjour Mick7,
Voici deux routines, la première hexascii convertit un octet en hexa en une chaine de caractères, la deuxième hexadec convertit la valeur hexa en une chaine décimale (entière). Tous les calculs de conversion s'effectuent en hexa, les chiffres isolés (entre 0 et 9) sont convertits en caractères.
hexascii: ;convertit la valeur mise dans al en 2 octets al et ah (al=poids fort, ah=poids faible)
aam 16 ;décompose en deux octets ah (division par 16) et al (reste division)
;peut être remplacé par mov ah,al et shr al,4 si pb (MASM)
cmp al,0x9 ;vérifie si numérique
jna num1 ;si <=9
add al,"A"-"0"-10 ;sinon ajoute 7
num1 xchg ah,al ;lit les 4 bits de poids fort
cmp al,0x9
jna num2
add al,"A"-"0"-10
num2 add ax,"00" ;rajoute "0"-0 à chacun des octets
ret
hexadec: ;effectue la conversion hexa vers chaine décimale
;premier paramètre empilé=pointeur vers une chaine de destination
;deuxième paramètre, un dword (signé) à convertir
push eax ;sauvegarde les registres de travail
push edx
push ecx
push esi
push edi
dec esp ;décrémente le pointeur de pile pour mettre le 0 terminal
xor edx,edx
mov [esp],dl ;met le zéro terminal
mov esi,esp ;pointeur de la chaine temporaire
sub esp,byte 11 ;créé un emplacement supplémentaire de 11 octets (signe+10caractères)
mov ecx,[esp+36] ;lit le dword à convertir
test ecx,ecx
jge convd
neg ecx
convd dec esi
mov eax,0xCCCCCCCD ;=(1/10) *800000000h
mul ecx
shr edx,3 ;prend la partie entière de la division par 100000000h puis par 8
lea eax,[edx+4*edx] ;multiplie par 5
shl eax,1 ;puis par 2 (soit par dix)
sub ecx,eax ;calcule le reste
add cl,"0" ;convertit en ascii (rajoute 30h)
mov [esi],cl ;sauvegarde
mov ecx,edx ;prend le quotient et continue le traitement
test ecx,ecx
jnz convd
mov ecx,esp
add ecx,12
sub ecx,esi ;longueur de la chaine
cmp [esp+39],byte 0 ;le nombre était-il négatif
jns copie
inc ecx ;1 caractère de plus pour le signe
dec esi ;si oui copie le signe au début de la chaine
mov [esi],byte "-"
copie mov edi,[esp+40] ;lit l'emplacement où mettre la chaine
rep movsb ;effectue la copie
add esp,byte 12 ;écrase l'emplacement temporaire de la chaine
pop edi
pop esi ;restaure les registres utilisés
pop ecx
pop edx
pop eax
ret 8 ;retour en vidant la pile des deux paramètres
A titre d'exemple la conversion de 1234ABCDh (305441741) va te donner les restes des divisions par dix dans l'ordre soit 1, 4, 7, 1, 4, 4, 5, 0, 3 et remettre ces chiffres (convertis en caractères) dans le bon ordre soit
33h,30h,35h,34h,34h,31h,37h,34h,31h et terminer par 0 soit encore
"305441741",0 avec éventuellement le signe '-' si négatif
J'espère avoir répondu à ta question
A+