Cours L'assembleur x86 32 bits en PDF


Télécharger Cours L'assembleur x86 32 bits en PDF

★★★★★★★★★★3.5 étoiles sur 5 basé sur 1 votes.
Votez ce document:

Télécharger aussi :


L’assembleur x86 32 bits

Architecture des ordinateurs

Guillaume Blin

IGM-LabInfo UMR 8049, Bureau 4B066

Université de Marne La Vallée

?gblin

G. Blin - Architecture des ordinateurs                     Assembleur x86 32 bits

Références

I L’excellent “PC Assembly Language” de Paul A. Carter http

logo                                                                                                                                                                                                                                                                                  logo

                                                                        G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits


Généralité   Langage Assembleur       Programmation assembleur

Plan

Généralité

Organisation

80x86

Regitres

Adressage

Interruptions

Langage Assembleur

Langage machine

Opérandes

Instructions de base

Programmation assembleur

Bases

Opérations et contrôles Sous-Programmes

Généralité   Langage Assembleur      Programmation assembleur             Organisation    80x86    Regitres    Adressage    Interruptions

Plan

Généralité

Organisation

80x86

Regitres

Adressage

Interruptions

Langage Assembleur

Langage machine

Opérandes

Instructions de base

Programmation assembleur

Bases

Opérations et contrôles Sous-Programmes

Donnée et mémoire : rappel

I Unité mémoire de base = octet

I Chaque octet en mémoire est étiqueté par un nombre unique (i.e. son adresse)

Adresse

0

1

2

3

4

5

6

7

Mémoire

2A

45

B8

20

8F

CD

12

2E

I Souvent, la mémoire est utilisée par bouts plus grand que des octets isolées.

mot

2 octets

double mot

4 octets

quadruple mot

8 octets

paragraphe

16 octets

I Toute donnée en mémoire est numérique

                        I Caractères = code caractère                                                                    logo

I Nombre = en base 2

                              G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits

UAL : rappel

I Unité chargée

I des opérations arithmétiques

I ADD (+), SUB (-), MUL (*), DIV ( :), INC (+ 1), DEC (- 1)

I des opérations logiques

I AND, OR, XOR, NOT, CMP

I LSL, LSR, ASR (décalages)

 

logo

                              G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits


Généralité    Langage Assembleur      Programmation assembleur             Organisation    80x86    Regitres    Adressage     Interruptions

Vision abstraite d’un ordinateur

Bus : nappe de fils conduisant de l’information entre les éléments

I Bus de données : transporte les données échangées

I Bus d’adresses : transporte des adresses en mémoire

I Position d’un élément requis par le CPU

I Position ou` écrire un élément envoyé par le CPU

I Bus de contrôle : transporte les informations de contrôle entre le CPU et les autres organes

Généralité   Langage Assembleur      Programmation assembleur             Organisation    80x86    Regitres    Adressage    Interruptions

Vision abstraite du processeur

 

I Registres : emplacements de stockage d’accès rapide

I UAL : unité de calcul (entiers et booléens)

I FPU : unité de calcul sur les “réels“

I Unité de contrôle : interprète les instructions

I Horloge : cadence le processeur (fréquence en MHz/GHz)

Le Central Processing Unit

I Dispositif physique exécutant les instructions (assez simples) I Pouvant nécessiter la présence de données dans des emplacements de stockage spécifiques (i.e. registres)

I Accès plus rapide aux registres qu’en mémoire I Mais, le nombre de registres est limité

? ne conserver que les données actuellement utilisées I {instructions d’un processeur} = son langage machine

logo

                              G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits

Le langage machine

I Les programmes machine

I structure basique

I instructions encodées en hexa (pas facilement lisible)

I doivent permettre au CPU de décoder rapidement les instructions

I Les programmes écrits dans d’autres langages ? en langage machine natif du processeur pour s’exécuter sur l’ordinateur

I ? c’est le rôle du compilateur

I Chaque type de processeur a son propre langage machine I C’est une des raisons pour lesquelles un programme écrit pour Mac ne peut pas être exécuté sur un PC.

logo

                              G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits


Généralité   Langage Assembleur      Programmation assembleur             Organisation    80x86    Regitres    Adressage    Interruptions

1978 - Le 8086

I Architecture avec tous les registres internes sur 16 bits I Bus d’adressage de 20 bits (pouvant adresser en mode dit “réel” jusqu’à 1Mo)

I Dans ce mode, un programme peut accéder à n’importe quelle adresse mémoire, même la mémoire des autres programmes!

I Pb de débogage et de sécurité

I La mémoire du programme doit être divisée en segments ? 64Ko.

I Extension du 8080 (8 bits avec simple accumulateur) I Ajout de registres supplémentaires avec utilisation déterminiée

I ? Machine à accumulateur étendu

 

Généralité   Langage Assembleur      Programmation assembleur             Organisation    80x86    Regitres    Adressage    Interruptions

1980 - Le 8087

I Co-porcesseur flottant Intel

I Extension du 8086 avec près de 60 opérations flottantes toutes commenc¸ant par “F” (e.g. FADD/FMUL)

I Basé sur organisation hybride avec pile et registres

I Pas un ensemble linéaire de registres tq AX/BX/CX/DX

I Mais structurés sous une certaine forme de pile s’étendant de ST0 à ST7.

I Conduit à l’introduction de la première norme de virgule flottante pour les PC à base de x86 : l’IEEE 754

I ? Machine à pile étendue

 

1982 - Le 80286

I Bus d’adressage de 24 bits (pouvant adresser jusqu’à 16Mo)

I Ajout d’instructions

I 2 fois plus rapide que le 8086 par cycle d’horloge.

I 2 modes de fonctionnement possibles :

I Mode d’adressage dit réel, dans lequel il se comporte comme un

8086 amélioré

I Un nouveau mode dit protégé 16 bits, permettant l’accés à 16Mo de mémoire et empêcher les prog d’accéder à la mémoire des uns et des autres. Mais toujours division en segments ? 64Ko.

logo

                              G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits

1985 - Le 80386

I Architecture à 32 bits avec registres 32 bits I Bus d’adressage de 32 bits (pouvant adresser jusqu’à 4Go)

I Les programmes sont toujours divisés en segments mais ? 4Go!

I Nouveaux modes d’adressage incluant la prise en charge de la pagination I Ajout d’instructions

                                                                                                                                                                                     logo

                              G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits


Généralité   Langage Assembleur      Programmation assembleur             Organisation    80x86    Regitres    Adressage    Interruptions

1989 - Le 80486

I Du point de vue de l’architecture, c’est une grande amélioration. Il y a un cache d’instruction et de donnée unifiée intégré.

I Unité de calcul en virgule flottante intégrée (FPU),

I Une unité d’interface de bus améliorée

 

Généralité   Langage Assembleur      Programmation assembleur             Organisation    80x86    Regitres    Adressage    Interruptions

Registres 16 bits du 8086

 

I 4 registres généraux : AX, BX, CX et DX.

décomposables en 2 registres de 8 bits pouvant être utilisés comme des registres d’un octet indépendants


 

I 4 registres généraux : AX, BX, CX et DX.

décomposables en 2 registres de 8 bits pouvant être utilisés comme des registres d’un octet indépendants Changer la valeur de AX changera les valeurs de AL et AH et vice versa

logo

                 G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits

 

I 4 registres généraux : AX, BX, CX et DX.

décomposables en 2 registres de 8 bits pouvant être utilisés comme des registres d’un octet indépendants Changer la valeur de AX changera les valeurs de AL et AH et vice versa utilisés dans beaucoup de déplacements de données et instructions arithmétiques.

logo

                 G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits


Généralité   Langage Assembleur      Programmation assembleur             Organisation    80x86    Regitres    Adressage    Interruptions

Registres 16 bits du 8086

 

I 4 registres généraux : AX, BX, CX et DX.

I 2 registres d’index : SI et DI.

utilisés comme des pointeurs, mais également comme les registres généraux

Généralité   Langage Assembleur      Programmation assembleur             Organisation    80x86    Regitres    Adressage    Interruptions

Registres 16 bits du 8086

 

I 4 registres généraux : AX, BX, CX et DX.

I 2 registres d’index : SI et DI.

utilisés comme des pointeurs, mais également comme les registres généraux mais non décomposables en registres de 8 bits

I 4 registres généraux : AX, BX, CX et DX. I 2 registres d’index : SI et DI.

I 2 registres de pile : BP et SP utilisés pour pointer sur des données dans la pile du langage machine et appelés, resp. pointeur de base et de pile

logo

                 G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits

I 4 registres généraux : AX, BX, CX et DX. I 2 registres d’index : SI et DI.

I 2 registres de pile : BP et SP

I 4 registres de segment : CS, DS, SS et ES

indiquent la zone de la mémoire utilisée par les différentes parties d’un programme

logo

                 G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits


Généralité   Langage Assembleur      Programmation assembleur             Organisation    80x86    Regitres    Adressage    Interruptions

Registres 16 bits du 8086

 

I 4 registres généraux : AX, BX, CX et DX. I 2 registres d’index : SI et DI.

I 2 registres de pile : BP et SP

I 4 registres de segment : CS, DS, SS et ES

indiquent la zone de la mémoire utilisée par les différentes parties d’un programme

CS = Code Segment, DS = Data Segment, SS = Stack

Segment et ES = Extra Segment

Généralité   Langage Assembleur      Programmation assembleur             Organisation    80x86    Regitres    Adressage    Interruptions

Registres 16 bits du 8086

 

I 4 registres généraux : AX, BX, CX et DX. I 2 registres d’index : SI et DI.

I 2 registres de pile : BP et SP

I 4 registres de segment : CS, DS, SS et ES

indiquent la zone de la mémoire utilisée par les différentes parties d’un programme

CS = Code Segment, DS = Data Segment, SS = Stack

Segment et ES = Extra Segment

ES est utilisé en tant que registre de segment temporaire

 

I 4 registres généraux : AX, BX, CX et DX. I 2 registres d’index : SI et DI.

I 2 registres de pile : BP et SP

I 4 registres de segment : CS, DS, SS et ES

I 1 registre de pointeur d’instruction : IP utilisé avec le registre CS pour mémoriser l’adresse de la prochaine instruction à exécuter

logo

                 G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits

 

I 4 registres généraux : AX, BX, CX et DX. I 2 registres d’index : SI et DI.

I 2 registres de pile : BP et SP

I 4 registres de segment : CS, DS, SS et ES

I 1 registre de pointeur d’instruction : IP utilisé avec le registre CS pour mémoriser l’adresse de la prochaine instruction à exécuter normalement, incrémenté lorsqu’une instruction est exécutée

logo

                 G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits


Généralité   Langage Assembleur      Programmation assembleur             Organisation    80x86    Regitres    Adressage    Interruptions

Registres 16 bits du 8086

 

I 4 registres généraux : AX, BX, CX et DX. I 2 registres d’index : SI et DI.

I 2 registres de pile : BP et SP

I 4 registres de segment : CS, DS, SS et ES

I 1 registre de pointeur d’instruction : IP

I 1 registre FLAGS stockant des informations importantes sur les résultats d’une instruction précédente comme des bits individuels dans le registre

Généralité   Langage Assembleur      Programmation assembleur             Organisation    80x86    Regitres    Adressage    Interruptions

Registres 16 bits du 8086

 

I 4 registres généraux : AX, BX, CX et DX. I 2 registres d’index : SI et DI.

I 2 registres de pile : BP et SP

I 4 registres de segment : CS, DS, SS et ES

I 1 registre de pointeur d’instruction : IP

I 1 registre FLAGS par exemple, le bit Z est positionné à 1 si le résultat de l’instruction précédente était 0 ou à 0 sinon


 

I 4 registres généraux : AX, BX, CX et DX. I 2 registres d’index : SI et DI.

I 2 registres de pile : BP et SP

I 4 registres de segment : CS, DS, SS et ES

I 1 registre de pointeur d’instruction : IP

I 1 registre FLAGS par exemple, le bit Z est positionné à 1 si le résultat de l’instruction précédente était 0 ou à 0 sinon toutes les instructions ne modifient pas les bits dans FLAGS         logo

                 G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits

Registres 32 bits du 80386

 

I Les processeurs 80386 et plus récents ont des registres

étendus.

I Par exemple, le registre AX 16 bits est étendu à 32 bits.

I Pour la compatibilité ascendante,

I AX, AL et AH existent toujours

I font référence à des parties de EAX I pas d’accès aux 16 bits de poids fort de EAX

logo

                              G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits


Généralité   Langage Assembleur      Programmation assembleur             Organisation    80x86    Regitres    Adressage    Interruptions

Registres 32 bits du 80386

 

I La plupart des autres registres sont également étendus.

I BP devient EBP; SP devient ESP; FLAGS devient EFLAGS et IP devient EIP.

I Mais plus d’accès aux registres 16 bits en mode protégé 32 bits

Généralité   Langage Assembleur      Programmation assembleur             Organisation    80x86    Regitres    Adressage    Interruptions

Registres 32 bits du 80386

 

I Les registres de segment sont toujours sur 16 bits dans le 80386.

I 2 nouveaux registres temporaires de segment : FS et GS.

Evolution du “mot”

I Initialement le terme “mot” = la taille des registres de données du processeur

I En 80x86, le terme est désormais un peu confus I Historiquement, il reste donc défini comme faisant 2 octets

(ou 16 bits)

logo

                              G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits

Mode Réel

I En mode réel (8086), la mémoire est limitée à seulement 1Mo (220)

I Les adresses valides vont de 00000 à FFFFF (20 bits en hexa) I 20 bits > capacité des registres 16 bits du 8086.

I ? L’adresse = un registre segment (selecteur, 16 bits de poids fort) + un de déplacement (offset, 16 bits de poids faible)

I L’adresse physique ? déplacement 32 bits égale à

16 ? selecteur + deplacement

I Multiplier par 16 en hexa ? ajouter un 0 à la droite du nombre (donc sur 20 bits). I Par exemple, l’adresse physique référencée par 047C :0048 est obtenue de la fac¸on suivante : 047C0

                                                                                                                                                                                   logo

                              G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits


Généralité   Langage Assembleur      Programmation assembleur             Organisation    80x86    Regitres    Adressage    Interruptions

Mode Réel

I La valeur du sélecteur = numéro de paragraphe (16o)

I Les adresses réelles segmentées ont des inconvénients :

Généralité   Langage Assembleur      Programmation assembleur             Organisation    80x86    Regitres    Adressage    Interruptions

Mode Réel

I La valeur du sélecteur = numéro de paragraphe (16o)

I Les adresses réelles segmentées ont des inconvénients :

I Une valeur de sélecteur référence 64Ko de mémoire

I Que se passe-t-il si un programme a plus de 64Ko de code?

Mode Réel

I La valeur du sélecteur = numéro de paragraphe (16o)

I Les adresses réelles segmentées ont des inconvénients :

I Une valeur de sélecteur référence 64Ko de mémoire

I Que se passe-t-il si un programme a plus de 64Ko de code? ? Le programme doit être divisé en segments de moins de 64Ko. Le passage d’un segment à l’autre nécessite le changement de CS

logo

                              G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits



Mode Réel

I La valeur du sélecteur = numéro de paragraphe (16o)

I Les adresses réelles segmentées ont des inconvénients :

I Une valeur de sélecteur référence 64Ko de mémoire

I Que se passe-t-il si un programme a plus de 64Ko de code?

I Problèmes similaires pour de grandes quantités de données et le registre DS.

logo

                              G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits


Généralité   Langage Assembleur      Programmation assembleur             Organisation    80x86    Regitres    Adressage    Interruptions

Mode Réel

I La valeur du sélecteur = numéro de paragraphe (16o)

I Les adresses réelles segmentées ont des inconvénients :

I Une valeur de sélecteur référence 64Ko de mémoire

I Que se passe-t-il si un programme a plus de 64Ko de code?

I Problèmes similaires pour de grandes quantités de données et le registre DS.

I Un octet en mémoire = pas une adresse segmentée unique. L’adresse physique 04808 peut être référencée par 047C :0048, 047D :0038, 047E :0028 ou 047B :0058.

Cela complique la comparaison d’adresses segmentées.

Généralité   Langage Assembleur      Programmation assembleur             Organisation    80x86    Regitres    Adressage    Interruptions

Mode Protégé 16 bits

I Dans mode protégé 16 bits du 80286, les valeurs du sélecteur sont interprétées de fac¸on totalement différente par rapport au mode réel.

I En mode réel, selecteur = num de paragraphe en mémoire. En mode protégé, c’est un indice dans un tableau de descripteurs

Mode Protégé 16 bits

I Dans mode protégé 16 bits du 80286, les valeurs du sélecteur sont interprétées de fac¸on totalement différente par rapport au mode réel.

I selecteur = un indice dans un tableau de descripteurs

I Les programmes sont divisés en segments; En mode réel, les segments sont à des positions fixes en mémoire et le sélecteur indique le numéro de paragraphe auquel commence le segment. En mode protégé, ils ne sont pas à des positions fixes en mémoire physique. De fait, pas besoin d’être en mémoire du tout

logo

                              G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits

Mode Protégé 16 bits

I Dans mode protégé 16 bits du 80286, les valeurs du sélecteur sont interprétées de fac¸on totalement différente par rapport au mode réel.

I selecteur = un indice dans un tableau de descripteurs

I les segments pas en mémoire du tout

I Utilise une technique appelée mémoire virtuelle

I Idée de base = ne garder en mémoire que les programmes et les données actuellement utilisés

I Le reste étant stocké temporairement sur le disque jusqu’à leur utilisation

I Les segments sont déplacés entre la mémoire et le disque selon les besoins

I Le placement des segments en mémoire n’est pas constant mais effectué de fa¸con transparente par le système d’exploitation

logo

                              G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits


Généralité   Langage Assembleur      Programmation assembleur             Organisation    80x86    Regitres    Adressage    Interruptions

Mode Protégé 16 bits

I Dans mode protégé 16 bits du 80286, les valeurs du sélecteur sont interprétées de fac¸on totalement différente par rapport au mode réel.

I selecteur = un indice dans un tableau de descripteurs

I les segments pas en mémoire du tout

I Utilise une technique appelée mémoire virtuelle

I Le programme n’a pas a être écrit différemment pour que la mémoire virtuelle fonctionne.

Généralité   Langage Assembleur      Programmation assembleur             Organisation    80x86    Regitres    Adressage    Interruptions

Mode Protégé 16 bits

I Dans mode protégé 16 bits du 80286, les valeurs du sélecteur sont interprétées de fac¸on totalement différente par rapport au mode réel.

I selecteur = un indice dans un tableau de descripteurs

I les segments pas en mémoire du tout

I Utilise une technique appelée mémoire virtuelle

I Le programme n’a pas a être écrit différemment pour que la mémoire virtuelle fonctionne.

I Chaque segment est assigné à une entrée dans un tableau de descripteurs.

I Cette entrée contient toutes les informations dont le système a besoin à propos du segment.

I e.g. est-il actuellement en mémoire? à quel endroit? ses droits d’accès?

I L’indice de l’entrée du segment est la valeur du sélecteur stockée dans les registres de segment.

Mode Protégé 16 bits

I Dans mode protégé 16 bits du 80286, les valeurs du sélecteur sont interprétées de fac¸on totalement différente par rapport au mode réel.

I selecteur = un indice dans un tableau de descripteurs

I les segments pas en mémoire du tout

I Utilise une technique appelée mémoire virtuelle

I Le programme n’a pas a être écrit différemment pour que la mémoire virtuelle fonctionne.

I Chaque segment est assigné à une entrée dans un tableau de descripteurs.

I L’inconvénient est que les déplacements sont toujours des quantités sur 16 bits.

? taille de segment toujours ? 64Ko. Cela rend l’utilisation de grands tableaux problématique

logo

                              G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits

Mode Protégé 32 bits I Mode introduit dès le 80386

I 2 différences avec le 16 bits du 286 :

I Déplacements étendus à 32 bits. Permettant un déplacement jusqu’à 4 milliards taille des segments ? 4Go.

I Segments divisables en pages (i.e. unité de 4Ko) Le système de mémoire virtuelle utlise les pages plutôt que les segments

? Chargement en mémoire que de certaines parties d’un segment

En mode 16 bits, tout le segment ou rien

Ce qui n’aurait pas été pratique avec les segments plus grands du mode 32 bits

I Dans Windows 3.x, le mode standard (resp. amélioré) ? mode protégé 16 (resp. 32) bits

I Windows 9X, Windows NT/2000/XP, OS/2 et Linux             logo fonctionnent tous en mode protégé 32 bits paginé

                              G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits


Généralité   Langage Assembleur      Programmation assembleur             Organisation    80x86    Regitres    Adressage    Interruptions

Interruptions

I Le flot ordinaire d’un programme doit pouvoir être interrompu pour traiter des évènements néccessitant une réponse rapide

I ? un mécanisme appelé interruptions I e.g. lorsqu’une souris est déplacée, elle interrompt le programme en cours pour gérer le déplacement de la souris

Généralité   Langage Assembleur      Programmation assembleur             Organisation    80x86    Regitres    Adressage    Interruptions

Interruptions

I Elles provoquent le passage du contrôle à un gestionnaire d’interruptions I Les gestionnaires d’interruptions = routines traitant une interruption

I un type d’interruption = un nombre entier I Au début de la mémoire physique, réside un tableau de vecteurs d’interruptions contenant les adresses segmentées des gestionnaires d’interruption.

I Le numéro d’une interruption = un indice dans ce tableau.

Interruptions

I Les interruptions externes proviennent de l’extérieur du processeur (e.g. la souris)

I Le cas de beaucoup de périphériques d’E/S (e.g. le clavier,

CD-ROM, ...)

I Les interruptions internes sont soulevées depuis le processeur,

à cause d’une erreur ou d’une instruction d’interruption I Les interruptions erreur sont également appelées traps I Les interruptions générées par l’instruction d’interruption sont

également appelées interruptions logicielles

logo

                              G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits

Interruptions

I Le DOS utilise ce type d’interruption pour implémenter son

Application Programming Interface I Les systèmes d’exploitation plus récents (comme Windows et

Unix) utilisent une interface basée sur C I Beaucoup de gestionnaires d’interruptions redonnent le contrôle au programme interrompu lorsqu’ils se terminent I Ils restaurent tous les registres aux valeurs qu’ils avaient avant l’interruption

I Le programme interrompu s’exécute comme si rien n’était arrivé (excepté qu’il perd quelques cycles processeur) I Les traps ne reviennent généralement jamais et arrêtent le programme

logo

                              G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits


Généralité   Langage Assembleur      Programmation assembleur              Langage machine    Opérandes      Instructions de base

Plan

Généralité

Organisation

80x86

Regitres

Adressage

Interruptions

Langage Assembleur

Langage machine

Opérandes

Instructions de base

Programmation assembleur

Bases

Opérations et contrôles Sous-Programmes

Généralité   Langage Assembleur      Programmation assembleur              Langage machine    Opérandes      Instructions de base

Le langage machine

I un type de processeur = son propre langage machine

I Instructions et opérandes stockés en mémoire principale. I Taille totale d’une instruction dépend de son type et du type d’opérande. I Toujours codée sur un nombre entier d’octets (facilite décodage)

I Composée de deux champs :

I le code opération, identifiant de l’instruction à réaliser;

I le champ opérande, contenant la donnée, ou sa référence en mémoire

 

Le langage machine

I Programmation directe du processeur avec les instructions machines :

I Difficile et long

I Compréhension quasi-impossible

I Par exemple, EAX = EAX + EBX est encodée par :

03 C3

I Solution : Utilisation d’un langage de plus haut niveau associant un mnémonique à chaque instruction machine : l’assembleur

logo

                              G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits

Langage Assembleur

I Un programme en langage d’assembleur = fichier texte

I Une instruction assembleur = une instruction machine

I Par exemple, EAX = EAX + EBX ?add eax, ebx

I Signification plus claire qu’en code machine

I Le mot add = mnémonique pour l’instruction d’addition I Forme générale d’une instruction assembleur :

mnémonique opérande(s)

logo

                              G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits


Généralité   Langage Assembleur      Programmation assembleur              Langage machine    Opérandes          Instructions de base

Langage Assembleur

I Un assembleur = programme convertissant un fichier texte contenant des instructions assembleur en code machine I Un compilateur = programme opérant des conversions similaires pour les langages de haut niveau

I Assembleur = plus simple qu’un compilateur I Une instruction assembleur = une instruction machine (pas le cas des langages de haut niveau)

I Chaque type de processeur ayant son propre langage machine, il a également son propre langage d’assemblage

I ? Portage entre différentes architectures d’ordinateur plus difficile

I Dans ce cours, on étudie le Netwide Assembler (NASM)

Généralité   Langage Assembleur      Programmation assembleur              Langage machine    Opérandes          Instructions de base

Opérandes d’instruction

I Les instructions ont un nombre et un type variables d’opérandes

I Mais, en général, en nombre fixé (0 à 3) I Les opérandes peuvent avoir les types suivants :

I registre : directement référence au contenu des registres

I mémoire : référence aux données en mémoire L’adresse = constante codée en dur ou calculée en utilisant les valeurs des registres

Les adresses = toujours des déplacements relatifs au début d’un segment

I immédiat : = des valeurs fixes listées dans l’instruction elle-même stockées dans l’instruction (dans le segment de code), pas dans le segment de données

I implicite : pas entrés explicitement

e.g. l’incrémentation (le un est implicite)

Instructions de base

I L’instruction la plus basique = MOV

I Déplace les données d’un endroit à un autre

mov dest, src

I La donnée spécifiée par src est copiée vers dest

I Restriction 1 = src et dest pas tous deux des opérandes mémoire

I Restriction 2 = src et dest même taille

e.g. AX ne peut pas être stockée dans BL

I ? Souvent des règles quelque peu arbitraires sur la fa¸con dont les différentes instructions sont utilisées

logo

                              G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits

Instructions de base

I Quelques exemples (point-virgule = un commentaire) :

mov eax, 3; stocke 3 dans le registre EAX

mov bx, ax; stocke la valeur de AX dans BX

I ADD = additionner des entiers

add eax, 4; eax = eax + 4

add al, ah; al = al + ah

I SUB = soustraire des entiers

sub bx, 10; bx = bx - 10

sub ebx, edi; ebx = ebx - edi

I INC et DEC incrémentent ou décrémentent les valeurs de 1 Le un étant implicite, le code machine pour INC et DEC est plus petit que ADD et SUB équivalentes

inc ecx; ecx++     logo dec dl; dl--

                              G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits


Généralité   Langage Assembleur      Programmation assembleur              Langage machine    Opérandes        Instructions de base

Directives

I Directive destinée à l’assembleur, pas au processeur

I Pour indiquer à l’assembleur une tâche à faire ou l’informer

I Pas traduites en code machine I Utilisations courantes :

I Définition de constantes

I Définition de mémoire pour stocker des données

I Grouper la mémoire en segment

I Inclure des codes sources de fac¸on conditionnelle

I Inclure d’autres fichiers

I Le code NASM est analysé par un préprocesseur I Semblable au préprocesseur C, mais elles commencent par un

% au lieu d’un # comme en C

Généralité   Langage Assembleur      Programmation assembleur              Langage machine    Opérandes      Instructions de base

La directive equ

I equ peut être utilisée pour définir un symbole I Un symbole = constantes nommées utilisables dans le programme assembleur I Format :

symbole equ valeur

I Valeur d’un symbole n’est pas redéfinissable

La directive %define

I Semblable à la directive #define du C I Souvent utilisée pour définir des macros

%define SIZE 100 mov eax, SIZE

I Macro plus flexible que symbole

I Redéfinissable

I Plus complexe que des nombres constants

logo

                              G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits

Directives de données

I Utilisées dans les segments de données pour réserver de la place en mémoire

I 2 fa¸cons de réserver I Une des directives RESX

logo

                              G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits


Généralité   Langage Assembleur      Programmation assembleur              Langage machine    Opérandes      Instructions de base

Directives de données I Utilisées dans les segments de données pour réserver de la place en mémoire

I 2 fa¸cons de réserver

I Une des directives RESX ne fait qu’allouer la place pour les données dont la taille est donnée par X

Unité

Lettre

octet

B

mot

W

double mot

D

quadruple mot

Q

dix octets

T

Généralité   Langage Assembleur      Programmation assembleur              Langage machine    Opérandes      Instructions de base

Directives de données I Utilisées dans les segments de données pour réserver de la place en mémoire

I 2 fa¸cons de réserver

I Une des directives RESX ne fait qu’allouer la place pour les données dont la taille est donnée par X

Unité

Lettre

octet

B

mot

W

double mot

D

quadruple mot

Q

dix octets

T

I Une des directives DX alloue la place et donne une valeur initiale suivant X

Directives de données I Utilisées dans les segments de données pour réserver de la place en mémoire

I 2 fa¸cons de réserver

I Une des directives RESX ne fait qu’allouer la place pour les données dont la taille est donnée par X

Unité

Lettre

octet

B

mot

W

double mot

D

quadruple mot

Q

dix octets

T

I Une des directives DX alloue la place et donne une valeur initiale suivant X

I Très courant de marquer les emplacements mémoire avec des labels; cela permet de faire référence facilement aux logo emplacements mémoire dans le code

                              G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits

Directives de données

I Exemples :

L1 db 0; octet libelle L1 = 0

L2 dw 1000; mot labelle L2 = 1000

L3 db 110101b; octet = valeur binaire 110101 (5310)

L4 db 12h; octet = valeur hexa 12 (1810)

L5 db 17o; octet = valeur octale 17 (1510)

L6 dd 1A92h; double mot = valeur hexa 1A92

L7 resb 1; 1 octet non initialise L8 db "A"; octet = code ASCII du A (65)

I Les doubles et simples quotes sont traitées de la même fac¸on I Les définitions de données consécutives sont stockées séquentiellement en mémoire

I ? L2 est stocké immédiatement après L1 en mémoire

logo

                              G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits




Généralité   Langage Assembleur      Programmation assembleur              Langage machine    Opérandes      Instructions de base

Directives de données

I Définition de séquences de mémoire

L9 db 0, 1, 2, 3; definit 4 octets L10 db "w", "o", "r", ‘‘d’’, 0; definit une chaine "word"

L11 db ’word’, 0; idem L10

I DD peut être utilisée pour définir à la fois des entiers et des réels en simple précision

I DQ en revanche n’est que pour les réels à double précision I Pour les grandes séquences, on utilise la directive TIMES qui répète son opérande un certain nombre de fois

L12 times 100 db 0; equivalent a 100 (db 0)

L13 resw 100; reserve de la place pour 100 mots

Généralité   Langage Assembleur      Programmation assembleur              Langage machine    Opérandes       Instructions de base

Utilisation des labels

I 2 fa¸cons d’utiliser les labels

I label simple fait référence à l’adresse (ou offset) de la donnée

I label entre crochets ([]) est interprété comme la donnée à cette adresse

Utilisation des labels

I 2 fa¸cons d’utiliser les labels

I label = pointeur vers la donnée et les crochets déréférencent le pointeur

logo

                              G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits

Utilisation des labels

I 2 fa¸cons d’utiliser les labels

I label = pointeur vers la donnée et les crochets déréférencent le pointeur

I En mode 32 bits, les adresses sont sur 32 bits. Voici quelques exemples :

1    mov al, [L1]; Copie l’octet situe en L1 dans AL

2    mov eax, L1; EAX = addresse de l’octet en L1

3    mov [L1], ah; copie AH dans l’octet en L1

4    mov eax, [L6]; copie le double mot en L6 dans EAX

5    add eax, [L6]; EAX = EAX + double mot en L6

6    add [L6], eax; double mot en L6 += EAX 7 mov al, [L6]; copie le premier octet du double mot en L6 dans AL

logo

                              G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits


Généralité   Langage Assembleur      Programmation assembleur              Langage machine    Opérandes           Instructions de base

Utilisation des labels

I 2 fa¸cons d’utiliser les labels

I label = pointeur vers la donnée et les crochets déréférencent le pointeur

I En mode 32 bits, les adresses sont sur 32 bits. Voici quelques exemples :

1    mov al, [L1]; Copie l’octet situe en L1 dans AL

2    mov eax, L1; EAX = addresse de l’octet en L1

3    mov [L1], ah; copie AH dans l’octet en L1

4    mov eax, [L6]; copie le double mot en L6 dans EAX

5    add eax, [L6]; EAX = EAX + double mot en L6

6    add [L6], eax; double mot en L6 += EAX 7 mov al, [L6]; copie le premier octet du double mot en L6 dans AL

I La ligne 7 montre une propriété importante de NASM. L’assembleur ne garde pas de trace du type de données auquel se réfère le label. C’est au programmeur de s’assurer de sa bonne utilisation.

Généralité   Langage Assembleur      Programmation assembleur              Langage machine    Opérandes           Instructions de base

Utilisation des labels

I Adresses souvent stockées dans registres (?pointeur en C)

I ? Là encore, aucune vérification

I Par exemple,

mov [L6], 1; stocke 1 en L6

qui produit une erreur operation size not specified I Car l’assembleur ne sait pas si “1” est un octet, un mot ou un double mot

I Pour réparer cela, il faut ajouter un spécificateur de taille :

mov dword [L6], 1; stocke 1 en L6

I Cela indique à l’assembleur de stocker un 1 dans le double mot qui commence en L6.

I Les autres spécificateurs de taille sont : BYTE, WORD,

QWORD et TWORD (10 o.) .


Plan

Généralité

Organisation

80x86

Regitres

Adressage

Interruptions

Langage Assembleur

Langage machine

Opérandes

Instructions de base

Programmation assembleur

Bases

Opérations et contrôles

                Sous-Programmes                                                                                              logo

                              G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits

E/S et langage C

I E/S ? activités très dépendantes du système

I ? interfa¸cage avec le matériel

I Le C fournit des bibliothèques standards de routines pour les

E/S

I Ce que n’offre pas l’assembleur I ? les routines assembleur sont interfacées avec du C I Cependant, il faut connaˆ?tre les conventions d’appels des routines que le C utilise I Assez compliqué ...

logo

                              G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits


Généralité   Langage Assembleur      Programmation assembleur             Bases    Opérations et controˆles      Sous-Programmes

E/S et langage C

I Pour simplifier les E/S, on utilisera les routines de Paul A.

Carter (masquent les conventions)

print int

affiche à l’écran la valeur d’un entier stocké dans

EAX

print char

affiche à l’écran le caractère dont le code ASCII est stocké dans AL

print string

affiche à l’écran le contenu de la chaˆ?ne à l’adresse stockée dans EAX. La chaˆ?ne doit être une chaˆ?ne de type C (i.e. terminée par 0).

print nl

affiche à l’écran un caractère de nouvelle ligne.

read int

lit un entier au clavier et le stocke dans le registre EAX.

read char

lit un caractère au clavier et stocke son code ASCII dans le registre EAX.

I Ces routines préservent les valeurs de tous les registres, excepté les routines read qui modifient EAX

Généralité   Langage Assembleur      Programmation assembleur             Bases    Opérations et controˆles      Sous-Programmes

E/S : utilisation

print int

affiche à l’écran la valeur d’un entier stocké dans EAX

print char

affiche à l’écran le caractère dont le code ASCII est stocké dans AL

print string

affiche à l’écran le contenu de la chaˆ?ne à l’adresse stockée dans EAX. La chaˆ?ne doit être une chaˆ?ne de type C (i.e. terminée par 0).

print nl

affiche à l’écran un caractère de nouvelle ligne.

read int

lit un entier au clavier et le stocke dans le registre EAX.

read char

lit un caractère au clavier et stocke son code ASCII dans le registre EAX.

I Utilisez la directive du préprocesseur %include

%include "asm " I Pour chaque routine,

I il faut charger EAX avec la valeur correcte

I utiliser une instruction CALL pour l’invoquer

Débogage

I En assembleur, le débogage consiste essentiellement à tracer l’état des registres et de la mémoire

I Macros utilisées comme des instructions ordinaires dont les opérandes sont séparés par des virgules

I dump regs A affiche les valeurs des registres (en hexadécimal) ainsi que les bits positionnés du registre FLAGS. “A” est un entier qui est affiché également (pour distinguer 2 appels)

logo

                              G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits

Débogage

I En assembleur, le débogage consiste essentiellement à tracer l’état des registres et de la mémoire

I Macros utilisées comme des instructions ordinaires dont les opérandes sont séparés par des virgules

I dump regs A

I dump mem A, B, C affiche les valeurs d’une région de la mémoire (en hexadécimal et ASCII). “A” est un entier utilisé pour étiqueter la sortie, “B” est l’adresse à afficher (cela peut

être un label), “C” est le nombre de paragraphes de 16 octets

à afficher après

logo

                              G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits


Généralité   Langage Assembleur      Programmation assembleur             Bases    Opérations et controˆles          Sous-Programmes

Débogage

I En assembleur, le débogage consiste essentiellement à tracer l’état des registres et de la mémoire

I Macros utilisées comme des instructions ordinaires dont les opérandes sont séparés par des virgules

I dump regs A

I dump mem A, B, C

I dump stack A, B, C affiche les valeurs de la pile du processeur autour de l’adresse contenue dans EBP (B double mots après et C double mots avant). “A” est un entier utilisé pour étiqueter la sortie

Généralité   Langage Assembleur      Programmation assembleur             Bases    Opérations et controˆles          Sous-Programmes

Débogage

I En assembleur, le débogage consiste essentiellement à tracer l’état des registres et de la mémoire

I Macros utilisées comme des instructions ordinaires dont les opérandes sont séparés par des virgules

I dump regs A

I dump mem A, B, C

I dump stack A, B, C

I dump math A affiche les valeurs des registres du coprocesseur arithmétique. “A” est un entier utilisé pour étiqueter la sortie

Créer un Programme

I Aujourd’hui, il est très rare de créer un programme autonome

écrit complètement en langage assembleur I L’assembleur est utilisé pour optimiser certaines routines critiques

I Pourquoi apprendre l’assembleur?

1.    Quelques fois, le code écrit en assembleur peut être plus rapide et plus compact que le code généré par un compilateur.

2.    L’assembleur permet l’accès à des fonctionnalités matérielles du système directement qu’il pourrait être difficile ou impossible à utiliser depuis un langage de plus haut niveau.

3.    Apprendre à programmer en assembleur aide à acquérir une compréhension plus profonde de la fac¸on dont fonctionne un ordinateur.

4.    Apprendre à programmer en assembleur aide à mieux comprendre comment les compilateurs et les langage de haut      logo niveau comme C fonctionnent.

                              G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits

Programme de lancement en C

I Programme de lancement en launch.c int main()

{ int ret status; ret status = asm main(); return ret status;

}

I Appel simplement asm main

I C’est la routine qui sera écrite en assembleur I Avantages :

I Cela laisse le système du C initialiser le programme de fac¸on à fonctionner correctement en mode protégé

I Tous les segments et les registres correspondants seront initialisés par le C

I La bibliothèque du C pourra être utilisée par le code      logo assembleur (e.g. les routines d’E/S)

                              G. Blin - Architecture des ordinateurs               Assembleur x86 32 bits


Généralité   Langage Assembleur      Programmation assembleur             Bases    Opérations et controˆles          Sous-Programmes

I Programme affichant un nombre entré au clavier

Généralité   Langage Assembleur      Programmation assembleur             Bases    Opérations et controˆles          Sous-Programmes

I %include "asm " :

inculsion de la bibliotèque d’E/S


I segment .data :

définit une section spécifiant la mémoire à stocker dans le segment de données. Seules les données initialisées doivent être définies dans ce segment

logo

G. Blin - Architecture des ordinateurs

Assembleur x86 32 bits

I segment .data :

définit une section spécifiant la mémoire à stocker dans le segment de données. Seules les données initialisées doivent être définies dans ce segment I prompt1 db "Enter a number : ", 0 et outmsg1 db "You entered ", 0 :

déclaration de chaˆ?nes de caractères (terminées par un octet nul comme en C)

logo

G. Blin - Architecture des ordinateurs

Assembleur x86 32 bits


Généralité   Langage Assembleur      Programmation assembleur

Bases    Opérations et controˆles      Sous-Programmes

I segment .bss :

définit un segment contenant les données non initialisées

input1 resd 1 est un label ? double mots


Généralité   Langage Assembleur      Programmation assembleur

Bases    Opérations et controˆles      Sous-Programmes

I segment .text :

définit le segment de code ou` sont placées les instructions sont placées.


I segment .text :

définit le segment de code ou` sont placées les instructions sont placées.

I La directive global indique à l’assembleur de rendre le label asm main global (portée interne par défaut) Cela permet à ce label d’être accédé de l’extérieur

logo

G. Blin - Architecture des ordinateurs

Assembleur x86 32 bits

I enter 0,0 et pusha liés à la convention d’appel de fonction

(vus plus tard)

logo

G. Blin - Architecture des ordinateurs

Assembleur x86 32 bits


Généralité   Langage Assembleur      Programmation assembleur

Bases    Opérations et controˆles      Sous-Programmes

I mov eax, prompt1 call print string :

charge l’@ de prompt1 dans le reg. eax puis demande son affichage

Généralité   Langage Assembleur      Programmation assembleur

Bases         Opérations et controˆles      Sous-Programmes

I call read int mov [input1], eax :

demande la lecture d’un entier stocké dans reg. eax puis copier dans input1

I popa mov eax, 0 leave ret : liés à la convention d’appel de fonction

logo

G. Blin - Architecture des ordinateurs

Assembleur x86 32 bits

Assembler le code

I La première étape consiste à assembler le code

I ? Créer un fichier objet correspondant nasm -f format-objet

format-objet dépend de la platforme et du compilateur C (pour nous elf ( Executable and Linkable Format))

                                                                                                                                                                                 



367