Cours Assembleur 8086 PDF
Cours Assembleur 8086 PDF
Cours Assembleur 8086 PDF
Pierre-Nicolas Clauss
Laboratoire Lorrain de Recherche en Informatique et ses Applications
12 mars 2008
1 Introduction
2 Notions générales
Plan
1 Introduction
Assembleur
Machine
Processeur
2 Notions générales
Instructions
Mémoire
Interruptions
Directives
Premier programme
Registre d'état
Branchements
Fonctions
Plan
1 Introduction
Assembleur
Machine
Processeur
2 Notions générales
Instructions
Mémoire
Interruptions
Directives
Premier programme
Registre d'état
Branchements
Fonctions
Usages
Avantages
Meilleure compréhension des langages
Meilleure compréhension des machines
Plan
1 Introduction
Assembleur
Machine
Processeur
2 Notions générales
Instructions
Mémoire
Interruptions
Directives
Premier programme
Registre d'état
Branchements
Fonctions
La machine
Deux fonctions
Calculer : rôle du (micro)-processeur
Stocker : rôle de la mémoire
Langage spécique
Un langage par processeur, appellé jeu d'instructions
Une référence commune : le binaire
Syntaxe
Binaire : 0b1010 ou 1010b
Octal : 012 ou 12o
Hexadécimal : 0xA ou 0Ah
Usage
Masques de bits
Permissions
Adresses mémoire
Positif et négatifs
Les entiers positifs sont stockés en binaire par conversion simple
Les entiers négatifs sont stockés en binaire par complément à deux
Cette méthode permet des opérations arithmétiques sans corrections
Complément à deux
Le complément à deux se calcule en deux étapes
On inverse d'abord les bits (complément à un)
On ajoute 1 au résultat
Par exemple
13 se note 0000 1101 sur 8 bits
-13 se note 1111 0011 sur 8 bits
L'opposé d'un entier est son complément à deux.
Il se calcule avec le mnemonic neg
[email protected] (LORIA) Cours Assembleur 8086 12 mars 2008 9 / 48
Introduction Processeur
Plan
1 Introduction
Assembleur
Machine
Processeur
2 Notions générales
Instructions
Mémoire
Interruptions
Directives
Premier programme
Registre d'état
Branchements
Fonctions
Registres
Mémoires de calcul
Les calculs se décomposent en opérations élémentaires
Ces opérations ont besoin de stocker des résultats intermédiaires
Le processeur contient de petites mémoires appellées registres
Sous-registres
AX AH AL
Et à tout instant : ax = ah * 256 + al 15 8 7 0
Plan
1 Introduction
Assembleur
Machine
Processeur
2 Notions générales
Instructions
Mémoire
Interruptions
Directives
Premier programme
Registre d'état
Branchements
Fonctions
Plan
1 Introduction
Assembleur
Machine
Processeur
2 Notions générales
Instructions
Mémoire
Interruptions
Directives
Premier programme
Registre d'état
Branchements
Fonctions
Jeu d'instructions
Instructions
Les instructions permettent de spécier les opérations à eectuer
Elles sont données au processeur sous la forme d'une chaine binaire
En assembleur, on les écrit sous forme de mnemonics
On utilise un programme d'assemblage pour transformer les
mnemonics en binaire
La traduction binaire d'un mnemonic est appellée un opcode
Exemples d'instructions
Instructions "load/store"
mov dst, src : Place la valeur de src dans dst
mov ax,14
Exemples d'instructions
Instructions de calcul
add dst, src : Additionne src et dst et place le résultat dans dst
add ax,bx ; ax ← ax + bx
sub dst, src : Soustrait src de dst et place le résultat dans dst
sub cx,dx ; cx ← cx - dx
shl dst, src : Décale dst de src bits vers la gauche et place le résultat
dans dst
shl dx,1 ; dx ← dx * 2
Plan
1 Introduction
Assembleur
Machine
Processeur
2 Notions générales
Instructions
Mémoire
Interruptions
Directives
Premier programme
Registre d'état
Branchements
Fonctions
Accéder à la mémoire
Structure de la mémoire
La mémoire se comporte comme un grand tableau d'octets
Accéder à la mémoire consiste à accéder à une case du tableau en
indiquant son indice, appellé adresse
Un accès mémoire se fait selon une certaine taille : on peut accéder à
plusieurs octets contiguës en une seule fois
On peut lire l'octet situé à l'adresse 123h
On peut écrire deux octets situés à l'adresse 456h
Le premier va dans la case 456h et le deuxième dans la case 457h
Granularité
Endianness
Supposons qu'on veuille stocker l'entier A035h dans la mémoire, on a
deux possibilités
Stocker d'abord l'octet A0h, puis l'octet 35h à la suite, c'est le mode
big-endian
Stocker d'abord l'octet 35h, puis l'octet A0h à la suite, c'est le mode
little-endian
Le 8086 et ses successeurs sont little-endian
Le Motorola 68000 et le PowerPC sont big-endian
Limitations 16 bits
Adressabilité
On donne l'adresse avec un registre
Les registres font 16 bits, donc on ne peut accéder qu'à
216 = 65536 = 64 Ko de mémoire
Pour accéder à plus de mémoire, on découpe la mémoire en segments
de 64 Ko et on choisit son segment avec un registre de segment
Segmentation
Mémoire et segments
Le 8086 accepte jusqu'à 1 Mo de mémoire. On l'adresse à l'aide d'une
paire de registres :
Un registre de segment, dont la valeur est appellée base ou segment.
Un registre général ou une constante, dont la valeur est appellée
déplacement ou oset.
L'adresse cs : ip correspond à l'octet numéro cs ∗ 16 + ip
CS IP
:
15 0 15 0
20 0
Adressage basé : l'opérande est une case mémoire dont l'adresse est
donnée par bx (avec ds par défaut) ou bp (avec ss par défaut)
mov ah,[bx] ; <=> mov ah,[ds:bx] => Opcode 8A27
mov al,[bp] ; <=> mov al,[ss:bp] => Opcode 8A4600
La pile
Manipulation de la pile
La pile est une zone de mémoire
Son sommet est la case mémoire à l'adresse ss : sp
On empile une valeur avec push et on dépile avec pop
push ax ; => Opcode 50 pop ax ; => Opcode 58
; <=> sub sp,2 ; <=> mov ax,[ss:sp]
; mov [ss:sp],ax ; add sp,2
Plan
1 Introduction
Assembleur
Machine
Processeur
2 Notions générales
Instructions
Mémoire
Interruptions
Directives
Premier programme
Registre d'état
Branchements
Fonctions
Interruptions
Fonctions
La plupart des machines disposent d'un mécanisme pour indiquer les
évènement extérieurs (clavier, disque dur, . . .), appellé interruptions
Leur fonctionnement consiste à interrompre le programme en cours
d'exécution et de lancer un autre bout de code (appellé gestionnaire)
pour gérer l'évènement
Sur le 8086, les interruptions sont spéciées par un numéro sur 8 bits :
il y'a donc 256 interruptions diérentes
La programme à exécuter lors d'une interruption est donnée par une
adresse segment : oset
Une table des adresses des interruptions se situent dans la mémoire
entre les adresses 0 et 1024 (inclus)
Le numéro d'interruption sert d'indice dans cette table pour trouver
l'adresse du programme à lancer
[email protected] (LORIA) Cours Assembleur 8086 12 mars 2008 28 / 48
Notions générales Interruptions
Interruptions
Schéma d'exécution
Execution
0000:0000
15 0 15 0
Transparence
Les interruptions matérielles sont toujours transparentes (sauvegarde
des registres)
Interruptions
Schéma d'exécution
Execution
Interruption clavier (9h)
0000:0000
15 0 15 0
Transparence
Les interruptions matérielles sont toujours transparentes (sauvegarde
des registres)
Interruptions
Schéma d'exécution
Execution
Interruption clavier (9h)
0000:0000
15 0 15 0
Transparence
Les interruptions matérielles sont toujours transparentes (sauvegarde
des registres)
Interruptions
Schéma d'exécution
Execution
Interruption clavier (9h)
0000:0000
15 0 15 0
Transparence
Les interruptions matérielles sont toujours transparentes (sauvegarde
des registres)
Interruptions
Schéma d'exécution
Execution
Interruption clavier (9h)
0000:0000
15 0 15 0 Execution de l’interruption
Transparence
Les interruptions matérielles sont toujours transparentes (sauvegarde
des registres)
Interruptions
Schéma d'exécution
Execution
Interruption clavier (9h)
0000:0000
15 0 15 0 Execution de l’interruption
Transparence
Les interruptions matérielles sont toujours transparentes (sauvegarde
des registres)
Interruptions
Schéma d'exécution
Execution
Interruption clavier (9h)
0000:0000
15 0 15 0 Execution de l’interruption
Transparence
Les interruptions matérielles sont toujours transparentes (sauvegarde
des registres)
Interruptions
Schéma d'exécution
Execution
Interruption clavier (9h)
0000:0000
15 0 15 0 Execution de l’interruption
Transparence
Les interruptions matérielles sont toujours transparentes (sauvegarde
des registres)
Interruptions
Plan
1 Introduction
Assembleur
Machine
Processeur
2 Notions générales
Instructions
Mémoire
Interruptions
Directives
Premier programme
Registre d'état
Branchements
Fonctions
Directive
Commandes spéciales
Les directives sont des commandes spéciales du programme
d'assemblage et ne sont pas des mnemonics.
Pour le programme fasm, les principales directives regroupent :
format qui indique le format du chier executable à générer
use16 qui indique que l'on souhaite compiler du code 16 bits
org qui indique la valeur de départ de ip
Directives communes
db n : insère l'octet n à cet endroit
dw n : insère le mot (= 2 octets) n à cet endroit
rb n : réserve la place pour n octets
rw n : réserve la place pour n mots
Remarque : db fonctionne aussi avec une chaîne de caractères et prend
les codes ASCII dans ce cas
[email protected] (LORIA) Cours Assembleur 8086 12 mars 2008 32 / 48
Notions générales Premier programme
Plan
1 Introduction
Assembleur
Machine
Processeur
2 Notions générales
Instructions
Mémoire
Interruptions
Directives
Premier programme
Registre d'état
Branchements
Fonctions
Hello world
Code source
message:
db "Hello world$"
Plan
1 Introduction
Assembleur
Machine
Processeur
2 Notions générales
Instructions
Mémoire
Interruptions
Directives
Premier programme
Registre d'état
Branchements
Fonctions
Registre ags
La plupart des opérations de calculs donnent des informations sur le
résultat dans le registre spécial ags
Les informations possibles sont :
CF : 1 si le résultat a donné lieu à une retenue
PF : 1 si l'octet de poids faible du résultat à un nombre pair de 1
AF : 1 si le résultat a donné lieu à une retenue sur le 3eme bit
ZF : 1 si le résultat est zéro
SF : 1 si le résultat est négatif
IF : 1 si les interruptions peuvent arriver
DF : 0 si la direction est incrémentée, 1 si elle est décrémentée
OF : 1 si le résultat ne tient pas dans la destination
Plan
1 Introduction
Assembleur
Machine
Processeur
2 Notions générales
Instructions
Mémoire
Interruptions
Directives
Premier programme
Registre d'état
Branchements
Fonctions
Branchements
Sélectionner du code
En C, on peut utiliser des structures de contrôle type if, while ou for
pour contrôler l'exécution du code
En assembleur, la prochaine instruction est toujours donnée par cs : ip
Pour accéder à une autre partie du code, on utilise des branchements
(ou goto)
mon_code:
; On fait des choses ici
jmp mon_code ; On retourne à l'étiquette "mon_code"
Branchements conditionnels
mon_code:
; On fait des choses ici
cmp ax, 0 ; On effectue une comparaison
jz mon_code ; On saute à mon_code si le résultat est zéro
Plan
1 Introduction
Assembleur
Machine
Processeur
2 Notions générales
Instructions
Mémoire
Interruptions
Directives
Premier programme
Registre d'état
Branchements
Fonctions
Fonctions
Appel
On découpe le code en fonctions pour simplier la lecture et la
maintenance du code
Pour écrire une fonction en assembleur, il faut savoir comment
l'appeller et comment lui passer des arguments
L'appel de fonction se fait avec le mnemonic call suivi de l'adresse de
la fonction
Si l'adresse est sur 16 bits, on dit que c'est un call near (i.e. dans le
même segment)
Si l'adresse est sur 16 : 16 bits, on dit que c'est un call far (i.e. dans un
autre segment)
Le mnemonic sauvegarde ip sur la pile, c'est l'adresse de retour
Pour un far call, l'instruction sauvegarde cs sur la pile (avant ip)
Fonctions
Retour
À la n d'une fonction, on utilise le mnemonic ret, qui restaure ip
depuis la pile
Pour faire un retour depuis une fonction appellée en far call, il faut
utilier retf, qui restaure aussi cs depuis la pile
Pour éviter tout problème, il est impératif que la pile soit dans le
même état avant de faire un ret ou un retf qu'au début de la fonction
Fonctions
Arguments
Il existe plusieurs méthodes pour passer des arguments à une fonction
Le choix de la méthode dépend d'une convention entre appellant et
appellé
Fonctions
Fonctions
Valeur de retour
Les valeurs de retour sont aussi soumises à un choix de convention
Les même conventions que pour le passage de paramètre s'appliquent
Le retour sur la pile est beaucoup plus complexe que le retour par les
registres
Exemple de fonction
Somme
Comme exemple, prenons une fonction à deux arguments a et b et qui
retourne leur moyenne
Exemple de fonction
; Convention:
; ax contient le premier entier
; bx contient le deuxième entier
; le résultat sera dans ax
moyenne:
add ax, bx
shr ax, 1
ret
mov ax, 12
mov bx, 6
call moyenne
; ici ax contient 9
Exemple de fonction
; Convention:
; premier entier empilé en dernier
; deuxième entier empilé en avant-dernier
; le résultat sera dans ax
moyenne: Memoire
push bp
mov bp,sp
push bx
mov ax,[bp+4]
mov bx,[bp+6]
add ax,bx SS:SP 6
shr ax,1
pop bx
pop bp
ret
push 6 ←
push 12
call moyenne
; ici ax contient 9
add sp,4
Exemple de fonction
; Convention:
; premier entier empilé en dernier
; deuxième entier empilé en avant-dernier
; le résultat sera dans ax
moyenne: Memoire
push bp
mov bp,sp
push bx
mov ax,[bp+4]
mov bx,[bp+6] SS:SP 12
add ax,bx 6
shr ax,1
pop bx
pop bp
ret
push 6
push 12 ←
call moyenne
; ici ax contient 9
add sp,4
Exemple de fonction
; Convention:
; premier entier empilé en dernier
; deuxième entier empilé en avant-dernier
; le résultat sera dans ax
moyenne: Memoire
push bp
mov bp,sp
push bx SS:SP IP
mov ax,[bp+4]
mov bx,[bp+6] 12
add ax,bx 6
shr ax,1
pop bx
pop bp
ret
push 6
push 12
call moyenne ←
; ici ax contient 9
add sp,4
Exemple de fonction
; Convention:
; premier entier empilé en dernier
; deuxième entier empilé en avant-dernier
; le résultat sera dans ax
moyenne: Memoire
push bp ←
mov bp,sp SS:SP BP
push bx IP
mov ax,[bp+4]
mov bx,[bp+6] 12
add ax,bx 6
shr ax,1
pop bx
pop bp
ret
push 6
push 12
call moyenne
; ici ax contient 9
add sp,4
Exemple de fonction
; Convention:
; premier entier empilé en dernier
; deuxième entier empilé en avant-dernier
; le résultat sera dans ax
moyenne: Memoire
push bp SS:SP BX
mov bp,sp SS:BP BP
push bx ←
IP
mov ax,[bp+4]
mov bx,[bp+6] 12
add ax,bx 6
shr ax,1
pop bx
pop bp
ret
push 6
push 12
call moyenne
; ici ax contient 9
add sp,4
Exemple de fonction
; Convention:
; premier entier empilé en dernier
; deuxième entier empilé en avant-dernier
; le résultat sera dans ax
moyenne: Memoire
push bp BX
mov bp,sp SS:SP BP
push bx IP
mov ax,[bp+4]
mov bx,[bp+6] 12
add ax,bx 6
shr ax,1
pop bx ←
pop bp
ret
push 6
push 12
call moyenne
; ici ax contient 9
add sp,4
Exemple de fonction
; Convention:
; premier entier empilé en dernier
; deuxième entier empilé en avant-dernier
; le résultat sera dans ax
moyenne: Memoire
push bp BX
mov bp,sp BP
push bx SS:SP IP
mov ax,[bp+4]
mov bx,[bp+6] 12
add ax,bx 6
shr ax,1
pop bx
pop bp ←
ret
push 6
push 12
call moyenne
; ici ax contient 9
add sp,4
Exemple de fonction
; Convention:
; premier entier empilé en dernier
; deuxième entier empilé en avant-dernier
; le résultat sera dans ax
moyenne: Memoire
push bp BX
mov bp,sp BP
push bx IP
mov ax,[bp+4]
mov bx,[bp+6] SS:SP 12
add ax,bx 6
shr ax,1
pop bx
pop bp
ret ←
push 6
push 12
call moyenne
; ici ax contient 9
add sp,4
Exemple de fonction
; Convention:
; premier entier empilé en dernier
; deuxième entier empilé en avant-dernier
; le résultat sera dans ax
moyenne: Memoire
push bp BX
mov bp,sp BP
push bx IP
mov ax,[bp+4]
mov bx,[bp+6] 12
add ax,bx 6
shr ax,1 SS:SP
pop bx
pop bp
ret
push 6
push 12
call moyenne
; ici ax contient 9
add sp,4 ←