Cours L'assembleur x86 32 bits
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 | 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))