db__ a écrit :
Citation :
la division par 16 ou le shift de 4 bits pour un affichage décimal implique que la veueur d'origine est en BCD.
|
lorsque la donnée (registre ou mémoire) est supposée être en binaire je maintient qu'un décalage de 4 bits effectue une division par 16.
lorsque la donnée est supposée être codée en Décimal Codé Binaire, un décalage de 4 bits effectue une division par 10 dans la mesure ou c'est un DCB compacté.
Si on veut convertir un nombre vers une représentation ascii en décimal, c'est beaucoup plus simple si le nombre est en DCB compacté ou non, un décalage de 4 bits sur une représentation binaire permet de faire une conversion vers de l'hexadécimal.
Un peu de code 32 bits cela nous changera un peu
Code :
- ; fonction traite32hexa
- ; entrée : edi -> pointe la chaine destination à l'endroit du chiffre le plus significatif
- ; edx -> nombre 32 bits à convertir
- ; sortie edi -> pointe la chaine destination après le dernier chiffre inscrit
- ; eax, ecx, edx perdus
- traite32hexa:
- mov ecx, 8 ; nombre de 8 chiffres
- lbl2: xor eax, eax
- shld eax, edx, 4 ; récupère les 4 bits de poids fort en eax
- shl edx, 4 ; shld ne modifie hélas pas edx
- add ch, ch ; anule le bit AF car ch est nul -> indispensable
- aaa ; convertit en dcb
- adc al, '0' ; convertit en ascii en rajoutant la retenu de aaa
- shl ah, 4 ; pour ajustement si nécessaire -> issu de aaa
- add al, ah ; rajoute 16 quand c'est nécessaire
- stosb ; chiffre hexa en majuscule
- dec ecx
- jnz lbl2 ; boucle sur le nombre
- ret
- ; fonction traite32deci
- ; entrée : edi -> pointe la chaine destination à l'endroit du chiffre le plus significatif
- ; ecx -> 10
- ; eax -> nombre 32 bits à convertir
- ; sortie : edi -> pointe le dernier caractère entré
- ; eax, edx perdus
- traite32deci:
- push edi
- add edi, ecx ; se positionne 10 caractères plus loin
- mov [edi + 1], ch ; met le 0 de fin de chaine
- lbl5: xor edx, edx ; dividende edx:eax
- div ecx ; quotient eax
- add dl, '0' ; convertit le reste en ascii
- mov [edi], dl ; met les unités dans la chaine
- dec edi ; pointe les dizaines
- or eax, eax ; y-a-t-il encore des chiffres
- jnz lbl5 ; oui -> on boucle
- mov edx, edi
- inc edx ; pointe le premier chiffre du résultat
- pop edi ; pointe le début du résultat
- mov al, [edx]
- stosb
- inc edx ; pointe le caratère suivant
- or al, al ; fin de chaine
- jnz lbl6 ; non -> on boucle
- ret
|
dans le cas 2, le nombre est supposée non signé.
le DIV est désastreux pour les performances. Si quelqu'un a mieux je suis preneur.
Je suis preneur pour une méthode ou des balises permettant d'avoir un résultat potable à l'écran
|