La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

©Pierre Marchand, 2001 210 Objectifs : À la fin de cette unité, vous saurez comment on peut programmer en assembleur les conversions usuelles binaire décimal.

Présentations similaires


Présentation au sujet: "©Pierre Marchand, 2001 210 Objectifs : À la fin de cette unité, vous saurez comment on peut programmer en assembleur les conversions usuelles binaire décimal."— Transcription de la présentation:

1 ©Pierre Marchand, Objectifs : À la fin de cette unité, vous saurez comment on peut programmer en assembleur les conversions usuelles binaire décimal et décimal binaire. Pour y parvenir, vous devrez atteindre les objectifs suivants : -décrire les principaux algorithmes de conversion entre le décimal et le binaire. Unité A6: Conversions

2 ©Pierre Marchand, On effectue souvent en assembleur les conversions élémentaires de binaire à décimal et vice-versa, parce que ces fonctions sont appelées très souvent et ont donc intérêt à être performantes. La conversion entre le décimal et le binaire s'effectue habituellement comme suit : Décimal (BCD) à binaire (voir supplément au volume, section 3.3.1) : R = d + 10 R Pour la conversion binaire à décimal, trois méthodes sont fréquem- ment utilisées : R = b + 2 R en arithmétique BCD Divisions répétées par 10 -> séquence de restes Tables Celle qu'on choisit dépend du processeur utilisé, du jeu d'instructions dont il dispose, et du temps d'exécution de chacune. Unité A6: Conversions

3 ©Pierre Marchand, Conversion décimal à binaire Effectuons la conversion d'une chaîne de caractères décimaux représentant un nombre positif vers un nombre binaire de 32 bits non signé. On utilise lalgorithme d + 10 x R. Exemple sur 16 bits : Unité A6: Conversions R = A x 0000 = A x 0001 = 000C A x 000C = 007B A x 007B = 04D2 Nombre à convertir en BCD

4 ©Pierre Marchand, Conversion décimal à binaire dec2Long proc decString:LPSTR movesi, decString xoreax, eax; résultat = 0 While:movzxebx, byte ptr[esi]; while (*decString++) incesi testbl, bl; terminé si nul jefin subbl, '0'; conversion ASCII-binaire imuleax, 10; résultat *= 10 addeax, ebx; résultat += digit jmpWhile fin:ret; résultat dans eax dec2Long endp Unité A6: Conversions

5 ©Pierre Marchand, Conversion binaire à décimal 1 e méthode : divisions par 10 Exemple sur 16 bits : ABCD / 000A= 112E reste E / 000A= 01B7 reste 08 01B7 / 000A= 002B reste B / 000A= 0004 reste / 000A= 0000 reste 04 Résultat : en BCD, en ASCII, ou Unité A6: Conversions

6 ©Pierre Marchand, Conversion binaire à décimal 1 e méthode : divisions par 10 Stratégie : comme le résultat est la séquence des restes, mais inversée, nous écrirons ces restes vers la gauche à partir du 11e octet dans une variable Temp de 12 octets initialisée à 0. Nous aurons ainsi automatiquement notre caractère de fin de chaîne. Ainsi, dans lexemple précédent, on aurait : Unité A6: Conversions Temp : Pointeur à la fin des divisions Pointeur initial Il nous restera à incrémenter le pointeur final et à faire un strcopy vers la destination.

7 ©Pierre Marchand, Conversion binaire à décimal 1 e méthode : divisions par 10 tempdb12 dup(0); espace pour restes = 12 zéros bin2String proc n:DWORD, String:LPSTR moveax, n; nombre à convertir leaesi, temp addesi, 10; pointer sur fin de temp movecx,10; 10 pour la division divis:movedx, 0; eax = quotient précédent divecx; diviser par 10 adddl, 0 ; convertir reste en ASCII mov[esi], dl; stocker dans temp decesi; écrire le suivant à gauche Unité A6: Conversions

8 ©Pierre Marchand, Conversion binaire à décimal 1 e méthode : divisions par 10 testeax, eax jnedivis; tant que quotient != 0 ; copier temp dans destination incesi; pointer sur dernier reste movedi, String; adresse destination copy:lodsb; reste suivant stosb testal, al; tant que reste 0 jnecopy ret bin2String endp Unité A6: Conversions

9 ©Pierre Marchand, Conversion binaire à décimal 2 e méthode : R = b + 2 * R Exemple sur 8 bits : Unité A6: Conversions R = = = = = = = = = Addition BCD Sur 2 octets

10 ©Pierre Marchand, Conversion binaire à décimal 2 e méthode : R = b + 2 * R Exemple sur 8 bits : Il faut ensuite décompacter les octets pour les convertir en ASCII > > Pour décompacter, on met un octet du résultat dans al et dans ah : ax = On fait ensuite le AND de ax avec 0xF00F : and ax,0xF00F ax = Puis on décale ah de 4 bits vers la droite : shr ah, 4 ax = Finalement, on ajoute 0x30 à chacun : add eax,0x3030 ax = Unité A6: Conversions

11 ©Pierre Marchand, Conversion binaire à décimal 2 e méthode : R = b + 2 * R Comme un nombre de 32 bits peut aller jusquà qui a 10 chiffres, il nous faudra faire nos additions BCD sur 5 octets (un octet contient 2 chiffres en BCD compacté. Unité A6: Conversions

12 ©Pierre Marchand, Conversion binaire à décimal 2 e méthode : R = b + 2 * R tempdb5 dup(0) bin2decString proc n:DWORD, decString:LPSTR movebx, n movedx, 32; 32 bits à traiter leaedi, temp decal:rclebx, 1; mettre le msb dans CF movesi, 4 movecx, 5 Unité A6: Conversions

13 ©Pierre Marchand, Conversion binaire à décimal 2 e méthode : R = b + 2 * R abcd:moval, byte ptr [edi+esi|; addition bcd sur 5 octets adcal, al; b + 2 * R daa; ajustement BCD movbyte ptr [edi+esi], al; résultat dans temp decesi dececx jneabcd; fin abcd decedx jnedecal; fin décal movecx, 5 movesi, str Unité A6: Conversions

14 ©Pierre Marchand, Conversion binaire à décimal 2 e méthode : R = b + 2 * R copy:moval, [edi]; copier dans destination et ; convertir le BCD compacté movah, al; en BCD non compacté andax, 0xF00F; masquer lsb et msb shrah, 4; décaler msb en place addax, 0x3030; convertir en ASCII xchgah, al; little endian movword ptr [esi], ax; stocker deux car inc edi; incrémenter source addesi, 2; incrémenter destination dececx jnecopy movbyte ptr[edi], 0; car de fin de chaîne ret Unité A6: Conversions

15 ©Pierre Marchand, Conversion binaire à décimal 3 e méthode : à laide d'une table Soit n le nombre à convertir. Le résultat r est un nombre de 10 chiffres ASCII quon initialise à 0 : r = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 Tant que n >= ,n = n ,r[0] = r[0] + 1 Tant que n >= ,n = n ,r[1] = r[1] + 1 Tant que n >= ,n = n ,r[2] = r[2] + 1 Tant que n >= ,n = n ,r[3] = r[3] + 1 Tant que n >= ,n = n , r[4] = r[4] + 1 Tant que n >= 10000, n = n , r[5] = r[5] + 1 Tant que n >= 1000, n = n , r[6] = r[6] + 1 Tant que n >= 100, n = n - 100, r[7] = r[7] + 1 Tant que n >= 10,n = n - 10,r[8] = r[8] + 1 r[9] = n Unité A6: Conversions

16 ©Pierre Marchand, Conversion binaire à décimal 3 e méthode : à laide d'une table Table dd , , , , , dd10000, 1000, 100, 10, 1 bin2decString proc n:DWORD, decString:LPSTR moveax, n leaesi, Table xorebx, ebx movedi, decString movecx, 10; 10 nombres dans Table digit: movbyte ptr [edi+ebx], 0; résultat = 0 movedx, dword ptr [esi+ebx*4]; Table[i] comp:cmpeax, edx; peut-on soustraire? jbsuiv Unité A6: Conversions

17 ©Pierre Marchand, Conversion binaire à décimal 3 e méthode : à laide d'une table subeax. edx; soustraire Table[i] addbyte ptr [edi+ebx], 1; incrémenter résultat jmpcomp; tant que eax > Table[i] suiv:incebx; élément suivant loopdigit movbyte ptr [edi+ebx], 0; car de fin de chaîne ret bin2decString endp Unité A6: Conversions

18 ©Pierre Marchand, Conversion binaire à décimal Certains raffinements pourraient s'avérer souhaitables dans les programmes présentés dans cette section. Notamment : Conversion décimal-binaire Traitement des nombres négatifs Traitement des espaces au début Conversion binaire-décimal Traitement des nombres négatifs Éliminer les zéros initiaux, par exemple, retourner 3 au lieu de Unité A6: Conversions

19 ©Pierre Marchand, Conversion binaire à chaîne hexadécimale Pour effectuer cette conversion, on effectue une rotation de eax de 4 bits vers la gauche pour mettre les 4 bits les plus significatifs à droite. On copie al dans bl. On masque ensuite les 4 bits de poids fort de bl avec : and bl, 0x0F. On ajoute 0x30 à bl pour le convertir en ASCII : add bl, 0x30 On écrit bl dans le résultat et on incrémente le pointeur. On effectue cette opération 8 fois. Unité A6: Conversions

20 ©Pierre Marchand, Conversion binaire à chaîne hexadécimale Long2HexString proc num:DWORD, HexString:LPSTR movedi, HexString moveax, num movecx, 8; 8 car. pour représenter un long lp:roleax, 4; 4 bits suivants movbl, al andbl, 0x0F; masquer les 4 bits de droite addbl, 0 ; convertir en ASCII cmpbl, 9 jbeok; si cest un chiffre 0-9 addbl, 7; si cest une lettre A-F Unité A6: Conversions

21 ©Pierre Marchand, Conversion binaire à chaîne hexadécimale ok:mov[edi],bl; placer dans la chaîne incedi dececx jnzlp movbyte ptr [edi], 0; caractère de fin de chaîne ret long2HexString endp Unité A6: Conversions

22 ©Pierre Marchand, Conversion binaire à chaîne hexadécimale Une autre façon deffectuer cette conversion utilise une table de 16 entrées contenant les codes ASCII des chiffres et des lettres correspondant aux nombres hexadécimaux 0 à F. On place le nombre à convertir dans edx. On effectue comme dans la façon précédente une rotation vers la gauche de edx, et on copie dl dans al. On masque les 4 bits de poids fort. Ensuite on se sert de al comme indice dans la table de 16 codes ASCII. Linstruction XLAT remplace al par le contenu de [ebx + al]. Par exemple, 0x0B donnera le code 0x42 = B. On écrit ensuite al dans le résultat et on incrémente le pointeur. Unité A6: Conversions

23 ©Pierre Marchand, Conversion binaire à chaîne hexadécimale tabledb ' ABCDEF' Long2HexString proc num:DWORD, HexString:LPSTR movedi, HexString leaebx, table; table de traduction dans ebx movecx, 8; toujours 8 car. movedx, num; nombre à convertir lp:roledx, 4; digit suivant moval, dl andal, 0x0F; garder 4 bits seulement xlat; traduire mov[edi], al; écrire dans destination Unité A6: Conversions

24 ©Pierre Marchand, Conversion binaire à chaîne hexadécimale incedi dececx jnelp movebyte ptr [edi], 0; caractère de fin de chaîne ret Long2HexString endp Unité A6: Conversions


Télécharger ppt "©Pierre Marchand, 2001 210 Objectifs : À la fin de cette unité, vous saurez comment on peut programmer en assembleur les conversions usuelles binaire décimal."

Présentations similaires


Annonces Google