Slides:



Advertisements
Présentations similaires
Premier programme en C :
Advertisements

L’électronique numérique
Tris.
Architecture de machines Codage des informations
Les procédures et interruptions en Assembleur (Tasm)
« 1.8. La numération binaire »
ARCHITECTURE INTERNE d’un MICROPROCESSEUR
Jacques Lonchamp IUT Nancy Charlemagne – DUT Informatique 1A
merci Laurent JEANPIERRE
Assembleur
La pile un élément essentiel
Le codage de l ’information
Les structures de données
Chap. 1 Structures séquentielles : listes linéaires
5. Les structures répétitives
Présentation Unité de codage
Système d’exploitation : Assembleur
Le binaire L’historique.
Le codage des nombres en informatique
Exercice Trame Ethernet
Cours algorithme 2 S. Tabbone.
La notation scientifique
Les piles Djamal Rebaïne.
Les puissances de 10 - Sommaire
Quels sont les différents modèles ?
Nature, numération, code
©Pierre Marchand, Objectifs : À la fin de cette unité, vous saurez comment sont implantées les quatre opérations arithmétiques : addition, soustraction,
LE MICROPROCESSEUR 8086/8088 Architecture externe du 8086
B.Shishedjiev - Informatique
Le codage des nombres en informatique

Interprétation du contenu d ’une zone mémoire
Système d’exploitation : Assembleur
Arithmétique des “computers”
CHAINE DE CARACTERES : Définition :
©Pierre Marchand, Objectifs : À la fin de cette unité, vous saurez comment on réfère aux opérandes mémoire et connaîtrez quelques instructions.
Les pointeurs Modes d’adressage de variables. Définition d’un pointeur. Opérateurs de base. Opérations élémentaires. Pointeurs et tableaux. Pointeurs et.
1 Tri Externe Chapitre 13: Pourquoi Trier? Problème classique en informatique (Voir Knuth, v.3)! Données requises en ordre trié P.ex.: Trouver.
1 Tri Externe Chapitre 13: Pourquoi Trier? Problème classique en informatique (Voir Knuth, v.3)! Données requises en ordre trié P.ex.: Trouver.
Conversions métriques
201 UMLV  Type « dictionnaire » sous-ensembles finis de E (ordonné) avec les opérations : Ens_vide :  Ens Ajouter : Ens x Elément  Ens Enlever.

Mise en forme en Mathématiques
Les bases de l’assembleur
Informatique, Ordinateur & Programme ...
Représentation des informations
Le Système Hexadécimal
Notions de pointeurs en C
Le Système Binaire Introduction Les bases à connaitre Conversions
Ecrire des expressions arithmétiques et logiques
Cohen Julien Neville gabriel
Précision d'une mesure et chiffres significatifs
L’écriture des grands nombres: les puissances de 10
Codage des nombres en informatique : le système binaire.
REPRESENTATION DE L’INFORMATION
1 INFOR 101 Chapitre 4 Marianne Morris. 2 Révision de chapitre 3 Algorithmes Sequential Search Selection Sort Binary Search Ordre de magnitude  (n) Mesurer.
Système d’exploitation : Assembleur Semaine 01 Introduction.
1. Spoon Christophe Delagarde, septembre 1998 I.U.T., Université de la Méditerrainée 2.
Codage de l’information
8PRO107 Éléments de programmation Les adresses et les pointeurs.
Cours d’initiation en Informatique
Chapitre 4 La représentation des nombres.
©Pierre Marchand, Unité 2: Représentation interne des informations Objectifs: À la fin de cette unité, -vous saurez comment les caractères et les.

Chapitre 4b La représentation des nombres.
Chapitre 9 Les caractères.
CHAPITRE 5 Les nombres entiers 1. Les entiers 2 Les entiers signés représentations pour le 0.
La NUMERISATION de l’information
Le codage des nombres en informatique
Transcription de la présentation:

Unité A6: Conversions 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. 210

Unité A6: Conversions 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. 211

Unité A6: Conversions 9.1 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 l’algorithme d + 10 x R. Exemple sur 16 bits : Nombre à convertir en BCD 1 2 3 410 R = 0000 01 + 000A x 0000 = 0001 02 + 000A x 0001 = 000C 03 + 000A x 000C = 007B 04 + 000A x 007B = 04D2 212

Unité A6: Conversions 9.1 Conversion décimal à binaire dec2Long proc decString:LPSTR mov esi, decString xor eax, eax ; résultat = 0 While: movzx ebx, byte ptr[esi] ; while (*decString++) inc esi test bl, bl ; terminé si nul je fin sub bl, '0' ; conversion ASCII-binaire imul eax, 10 ; résultat *= 10 add eax, ebx ; résultat += digit jmp While fin: ret ; résultat dans eax dec2Long endp 213

Unité A6: Conversions 9.2 Conversion binaire à décimal 1e méthode : divisions par 10 Exemple sur 16 bits : ABCD / 000A = 112E reste 01 112E / 000A = 01B7 reste 08 01B7 / 000A = 002B reste 09 002B / 000A = 0004 reste 03 0004 / 000A = 0000 reste 04 Résultat : 04 03 09 08 01 en BCD, 34 33 39 38 31 en ASCII, ou 4398110 214

Unité A6: Conversions 9.2 Conversion binaire à décimal 1e 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 l’exemple précédent, on aurait : Temp : 00 00 00 00 00 00 34 33 39 38 31 00 Pointeur à la fin des divisions Pointeur initial Il nous restera à incrémenter le pointeur final et à faire un strcopy vers la destination. 215

Unité A6: Conversions 9.2 Conversion binaire à décimal 1e méthode : divisions par 10 temp db 12 dup(0) ; espace pour restes = 12 zéros bin2String proc n:DWORD, String:LPSTR mov eax, n ; nombre à convertir lea esi, temp add esi, 10 ; pointer sur fin de temp mov ecx,10 ; 10 pour la division divis: mov edx, 0 ; eax = quotient précédent div ecx ; diviser par 10 add dl, ’0 ’ ; convertir reste en ASCII mov [esi], dl ; stocker dans temp dec esi ; écrire le suivant à gauche 216

Unité A6: Conversions 9.2 Conversion binaire à décimal 1e méthode : divisions par 10 test eax, eax jne divis ; tant que quotient != 0 ; copier temp dans destination inc esi ; pointer sur dernier reste mov edi, String ; adresse destination copy: lodsb ; reste suivant stosb test al, al ; tant que reste ≠ 0 jne copy ret bin2String endp 217

Unité A6: Conversions 9.2 Conversion binaire à décimal 2e méthode : R = b + 2 * R Exemple sur 8 bits : Addition BCD Sur 2 octets 1 0 1 1 1 1 0 1 R = 00 00 1 + 00 00 + 00 00 = 00 01 0 + 00 01 + 00 01 = 00 02 1 + 00 02 + 00 02 = 00 05 1 + 00 05 + 00 05 = 00 11 1 + 00 11 + 00 11 = 00 23 1 + 00 23 + 00 23 = 00 47 0 + 00 47 + 00 47 = 00 94 1 + 00 94 + 00 94 = 01 89 218

Unité A6: Conversions 9.2 Conversion binaire à décimal 2e méthode : R = b + 2 * R Exemple sur 8 bits : Il faut ensuite décompacter les octets pour les convertir en ASCII. 01 89 -> 00 01 08 09 -> 30 31 38 39 00 Pour décompacter, on met un octet du résultat dans al et dans ah : ax = 89 89 On fait ensuite le AND de ax avec 0xF00F : and ax,0xF00F ax = 80 09 Puis on décale ah de 4 bits vers la droite : shr ah, 4 ax = 08 09 Finalement, on ajoute 0x30 à chacun : add eax,0x3030 ax = 38 39 219

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

Unité A6: Conversions 9.2 Conversion binaire à décimal 2e méthode : R = b + 2 * R temp db 5 dup(0) bin2decString proc n:DWORD, decString:LPSTR mov ebx, n mov edx, 32 ; 32 bits à traiter lea edi, temp decal: rcl ebx, 1 ; mettre le msb dans CF mov esi, 4 mov ecx, 5 221

Unité A6: Conversions 9.2 Conversion binaire à décimal 2e méthode : R = b + 2 * R abcd: mov al, byte ptr [edi+esi| ; addition bcd sur 5 octets adc al, al ; b + 2 * R daa ; ajustement BCD mov byte ptr [edi+esi], al ; résultat dans temp dec esi dec ecx jne abcd ; fin abcd dec edx jne decal ; fin décal mov ecx, 5 mov esi, str 222

Unité A6: Conversions 9.2 Conversion binaire à décimal 2e méthode : R = b + 2 * R copy: mov al, [edi] ; copier dans destination et ; convertir le BCD compacté mov ah, al ; en BCD non compacté and ax, 0xF00F ; masquer lsb et msb shr ah, 4 ; décaler msb en place add ax, 0x3030 ; convertir en ASCII xchg ah, al ; little endian mov word ptr [esi], ax ; stocker deux car inc edi ; incrémenter source add esi, 2 ; incrémenter destination dec ecx jne copy mov byte ptr[edi], 0 ; car de fin de chaîne ret 223

Unité A6: Conversions 9.2 Conversion binaire à décimal 3e méthode : à l’aide d'une table Soit n le nombre à convertir. Le résultat r est un nombre de 10 chiffres ASCII qu’on initialise à 0 : r = ‘0’, ‘0’, ‘0’, ‘0’, ‘0’, ‘0’, ‘0 , ‘0’, ‘0’, ‘0’, 0 Tant que n >= 1000000000, n = n - 1000000000, r[0] = r[0] + 1 Tant que n >= 100000000, n = n - 10000000, r[1] = r[1] + 1 Tant que n >= 10000000, n = n - 10000000, r[2] = r[2] + 1 Tant que n >= 1000000, n = n - 1000000, r[3] = r[3] + 1 Tant que n >= 100000, n = n - 100000, r[4] = r[4] + 1 Tant que n >= 10000, n = n - 10000, r[5] = r[5] + 1 Tant que n >= 1000, n = n - 1000, 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 224

Unité A6: Conversions 9.2 Conversion binaire à décimal 3e méthode : à l’aide d'une table Table dd 1000000000, 100000000, 10000000, 1000000, 100000, dd 10000, 1000, 100, 10, 1 bin2decString proc n:DWORD, decString:LPSTR mov eax, n lea esi, Table xor ebx, ebx mov edi, decString mov ecx, 10 ; 10 nombres dans Table digit: mov byte ptr [edi+ebx], ’0’ ; résultat = ‘ 0 ’ mov edx, dword ptr [esi+ebx*4] ; Table[i] comp: cmp eax, edx ; peut-on soustraire? jb suiv 225

Unité A6: Conversions 9.2 Conversion binaire à décimal 3e méthode : à l’aide d'une table sub eax. edx ; soustraire Table[i] add byte ptr [edi+ebx], 1 ; incrémenter résultat jmp comp ; tant que eax > Table[i] suiv: inc ebx ; élément suivant loop digit mov byte ptr [edi+ebx], 0 ; car de fin de chaîne ret bin2decString endp 226

Unité A6: Conversions 9.2 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 Éliminer les zéros initiaux, par exemple, retourner 3 au lieu de 000000003 227

Unité A6: Conversions 9.3 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. 12 34 56 78 23 45 67 81 81 01 01 31 228

Unité A6: Conversions 9.3 Conversion binaire à chaîne hexadécimale Long2HexString proc num:DWORD, HexString:LPSTR mov edi, HexString mov eax, num mov ecx, 8 ; 8 car. pour représenter un long lp: rol eax, 4 ; 4 bits suivants mov bl, al and bl, 0x0F ; masquer les 4 bits de droite add bl, ‘ 0 ’ ; convertir en ASCII cmp bl, ‘ 9 ’ jbe ok ; si c’est un chiffre 0-9 add bl, 7 ; si c’est une lettre A-F 229

Unité A6: Conversions 9.3 Conversion binaire à chaîne hexadécimale ok: mov [edi],bl ; placer dans la chaîne inc edi dec ecx jnz lp mov byte ptr [edi], 0 ; caractère de fin de chaîne ret long2HexString endp 230

Unité A6: Conversions 9.3 Conversion binaire à chaîne hexadécimale Une autre façon d’effectuer 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. L’instruction 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. 231

Unité A6: Conversions 9.3 Conversion binaire à chaîne hexadécimale table db '0123456789ABCDEF' Long2HexString proc num:DWORD, HexString:LPSTR mov edi, HexString lea ebx, table ; table de traduction dans ebx mov ecx, 8 ; toujours 8 car. mov edx, num ; nombre à convertir lp: rol edx, 4 ; digit suivant mov al, dl and al, 0x0F ; garder 4 bits seulement xlat ; traduire mov [edi], al ; écrire dans destination 232

Unité A6: Conversions 9.3 Conversion binaire à chaîne hexadécimale inc edi dec ecx jne lp move byte ptr [edi], 0 ; caractère de fin de chaîne ret Long2HexString endp 233