Syllabus Assembleur
Syllabus Assembleur
Syllabus Assembleur
Architecture et langage
assembleur du
microprocesseur de la
famille INTEL 8086
1
Première année / 2010
Sommaire
1 Structure d’un processeur En 5
général....................................................................
1.1 L'unité de 5
calcul...................................................................................
1.2 L'unité de 6
control ................................................................................
2 Le microprocesseur 7
8086 .................................................................................
........
2.1 La segmentation de la 8
mémoire............................................................
2.2 Les registres du 10
8086...........................................................................
2.2.1 Les registres 10
généraux.......................................................................
2.2.2 Les registres d'adressage 11
(offset) ......................................................
2.2.3 Les registres de 11
segment ..................................................................
2.2.4 Le registre d'état 12
(flags)....................................................................
2.3 Les modes 13
d'adressage ........................................................................
2.4 Taille des échanges avec la 16
mémoire ....................................................
2.5 Les instructions du 17
8086.......................................................................
2.5.1 Les instructions de 17
transfert ..............................................................
2.5.2 Les instructions 19
Arithmétiques............................................................
2.5.3 Les instructions 21
logiques ...................................................................
2.5.4 Les masques 22
logiques :......................................................................
2.5.5 Les instructions de 23
décalage..............................................................
2.5.6 Instructions agissant sur les 24
indicateurs .............................................
2.5.7 Les instructions de contrôle de 25
boucle................................................
2.5.8 Les instructions de 25
2
Première année / 2010
branchement .......................................................
2.5.9 Instructions d'accès aux ports 28
d'E/S....................................................
2.6 tableau récapitulatif des 29
instructions......................................................
3 L’assembleur 30
NASM................................................................................
.................
3.1 Les directives de 30
NASM .......................................................................
3.2 Les pseudo instruction de 31
NASM ..........................................................
3.3 Les 31
expressions....................................................................................
4 Les entrées 32
sorties ..............................................................................
......................
4.1 L'interruption 10h du 32
BIOS...................................................................
4.2 L'interruption 21h du 35
DOS....................................................................
4.3 Accès direct à la mémoire 37
Vidéo ...........................................................
4.4 Les 38
temporisations...............................................................................
Objectif du cours
Dans ce cours on va présenter le Microprocesseur 8086 d’Intel, on va
étudier son jeux d'instruction complet, on va apprendre à le programmer
en assembleur et finir par étudier les entrées sorties.
3
Première année / 2010
INTRODUCTION
Le rôle d'un processeur est d'exécuter des programmes. Un programme
est une suite d'instructions écrites une par ligne. Une instruction peut
être plus ou moins sophistiquée selon le langage utilisé. Pour un langage
de bas niveau comme l'assembleur, une instruction réalise une tache
4
Première année / 2010
Ces programmes sources sont compréhensibles par nous mais pas par le
processeur.
Pour que le processeur puisse les comprendre il faut les traduire
(compiler) en langage machine qui est une suite de codes machine. Sur
les PCs, se sont les fichiers avec l'extension .exe (test.exe). Chaque
langage de programmation a son compilateur qui permet de transformer
le programme source en un programme exécutable compréhensible par le
processeur. Tous les exécutables se ressemblent et le processeur ne sait
pas avec quel langage ils ont été écrits.
Avec un langage de haut niveau comme le C++, une instruction que nous
écrivons peut être très sophistiquée. C'est le compilateur C++ qui la
traduit en un ensemble d'instructions élémentaires compréhensible par le
processeur.
5
Première année / 2010
L'ALU :
Elle est constituée d'un circuit logique combinatoire qui reçoit deux
opérandes A (An
. . . A1 A0) et B (Bn . . . B1 B0) et produit le résultat S (Sm . . . S1 S0) selon
l'indication appliquée sur l'entrée C (Ck . . . C1 C0). Les opérations réalisées
peuvent être soit arithmétiques, S=A+B, S=A-B, S=AxB … ou logiques
S=A OU B, S=A ET B, S= A XOR B …
6
Première année / 2010
Les registres :
L’horloge
Il existe des processeurs qui exécutent une instruction par coup d'horloge,
ce n'est pas le cas du 8086.
Le compteur programme PC
7
Première année / 2010
Le décodeur
Le séquenceur
Le registre d'état
2. LE MICROPROCESSEUR 8086
8
Première année / 2010
Le 8086 possède 20 bits d'adresse, il peut donc adresser 220 octets soit 1
Mo.
L'adresse de la première case mémoire est 0000 0000 0000 0000 0000
celle de la dernière casse est 1111 1111 1111 1111 1111 1111. Il me
paraît inutile de justifier pourquoi à partir de cet instant, nous allons
représenter les adresses en hexadécimal, et notre 8086 peut donc
adresser 1 Mo allant de 00000 à FFFFF. Le problème qui se pose est
comment représenter ces adresses au sein du μP puisque les registres ne
9
Première année / 2010
Puisque avec 16 bits en peut adresser 216 octets = 65535 octets = 64 ko,
La mémoire totale adressable de 1 Mo est fractionnée en pages de 64 ko
appelés segments. On utilise alors deux registres pour adresser une case
mémoire donnée, Un registre pour adresser le segment qu'on appelle
registre segment et un registre pour adresser à l'intérieur du segment
qu'on désignera par registre d'adressage ou offset. Une adresse se
présente toujours sous la forme segment:offset
10
Première année / 2010
11
Première année / 2010
AX : Accumulateur
• Usage général,
• Obligatoire pour la multiplication et la division,
• Ne peut pas servir pour l'adressage
BX : Base
• Usage général,
• Adressage, (Par défaut, son offset est relatif au segment DS)
CX : Comptage et calcul
• Usage général,
• Utilisé par certaines instructions comme compteur de répétition.
• Ne peut pas servir pour l'adressage
DX : Data
• Usage général,
• Dans la multiplication et la division 16 bits, il sert comme extension au
registre AX pour contenir un nombre 32 bits,
• Ne peut pas servir pour l'adressage
SP : Pointeur de Pile
BP : Pointeur de Base
• Adressage comme registre de base, (Par défaut, son offset est relatif à
SS)
• Usage général
• Adressage comme registre d’index, (Par défaut, son offset est relatif à
DS)
12
Première année / 2010
• Adressage comme registre d’index, (par défaut, son offset est relatif à
DS)
• Certaines instruction de déplacement de donnés l'utilise comme index
de l'opérande destination, l'opérande destination étant indexé par SI
Ces registrent sont combiné avec les registres d’offset pour former les
adresses. Une case mémoire est repérée par une adresse de la forme
RS:RO. On place le registre segment au début d’une zone mémoire de de
64Ko, ensuite on fait varier le registre d’offset qui précise l’adresse
relative par rapport à cette position.
CS : Code Segment
DS : Data Segment
SS : Stack Segment
Début de La pile qui est une zone mémoire gérée d’une façon particulière.
Elle est organisée comme une pile d’assiettes. On pose et on retire les
assiettes toujours sur le haut de la pile. Un seul registre d’adresse suffit
donc pour la gérer, c’est le stack pointer SP. On dit que c’est une pile LIFO
(Last IN, First Out).
Empiler une donnée : sauvegarder une donnée sur (le sommet) de la pile
Dépiler une donnée : retirer une donnée (du sommet) de la pile
ES : Extra Segment
13
Première année / 2010
S : (Signe) reproduit le bit de poids fort d'une quantité signée sur 8 bits ou
sur 16 bits. L'arithmétique signée fonctionne en complément à 2. S=0 :
positif, S=1 : négatif. Ce flag sert lors de sauts conditionnels.
T : (Trap) met le CPU en mode pas à pas pour faciliter la recherche des
défauts d'exécution.
14
Première année / 2010
INST : instruction,
R : Registre quelconque,
Rseg : Registre Segment
Roff : Registre d’offset
Adr : Adresse
[ adr] : contenu Mémoire
Off : Offset de l’adresse
Im : donnée (constante)
Dep : déplacement (constante)
Op : Opérande
Os : Opérande source
Od : opérande destination
INST R , R
INST R
Exemples :
15
Première année / 2010
INST R , im
INST taille [adr] , im
Exemples :
MOV AL, 'a' : Charger le registre AL par le code ASCII du caractère 'a'
MOV AX, 'a' : Charger le registre AH par 00 et le registre AL par le code
ASCII du caractère 'a'
MOV AX,'ab' : Charger AH par 'a' et AL par 'b'
INST R , [adr]
INST [adr] , R
INST taille [adr] , im
Exemples :
16
Première année / 2010
Exemples :
L’offset se trouve dans l’un des deux registres de base BX ou BP. On peut
préciser un déplacement qui sera ajouté au contenu de Roff pour
déterminer l’offset,
Exemples :
L’offset se trouve dans l’un des deux registres d’index SI ou DI. On peut
préciser un déplacement qui sera ajouté au contenu de Ri pour déterminer
l’offset,
Exemples :
MOV AX, [SI] ; Charger AX par le contenu de la mémoire d'adresse DS:SI
MOV AX, [SI+500] ; Charger AX par la mémoire d'adresse DS:SI+500
17
Première année / 2010
Exemples :
18
Première année / 2010
Quand on fait une opération entre une constante et une case mémoire,
il y a ambiguïté, le processeur ne sait pas s’il faut considérer la constante
sur 8 bits ou sur 16 bits. Il faut utiliser les préfixes BYTE et WORD pour
préciser le nombre d’octets á écrire :
MOV Od , Os
PUSH Op
- Décrémente SP de 2
- Copie Op dans la mémoire pontée par SP
PUSH R16
PUSH word [adr]
POP Op
19
Première année / 2010
- Incrémente SP de 2
POP R16
POP word M
PUSHA
POPA
XCHG OD , OS
20
Première année / 2010
XCHG R1 , R2
XCHG [adr] , R
XCHG R , [adr]
Addition :
Soustraction :
21
Première année / 2010
Multiplication
• L'opérande Op ne peut pas être une donnée, c’est soit un registre soit
une position mémoire, dans ce dernier cas, il faut préciser la taille (byte ou
word)
MUL BL ; AL x BL → AX
MUL CX ; AX x CX → DX:AX
MUL byte [BX] ; AL x (octet pointé par BX) → AX
MUL word [BX] ; AX x (word pointé par BX) → DX :AX
Division
22
Première année / 2010
AND Od , Os ET logique
Od ET Os Od
OR Od , Os OU logique
Od OU Os Od
Forcer un bit à 0 :
23
Première année / 2010
Pour forcer un bit à 0 sans modifier les autres bits, on utilise l'opérateur
logique AND et ces propriétés :
On fait un AND avec une valeur contenant des 0 en face des bits qu'il faut
forcer à 0 et des 1 en face des bits qu'il ne faut pas changer
Forcer un bit à 1 :
Pour forcer un bit à 1 sans modifier les autres bits, on utilise l'opérateur
logique OR et ces propriétés :
On fait un OR avec une valeur contenant des 1 en face des bits qu'il faut
forcer à 1 et des 0 en face des bits qu'il ne faut pas changer
Inverser un bit :
Pour inverser la valeur d'un bit sans modifier les autres bits, on utilise
l'opérateur logique XOR et ces propriétés :
- X XOR 1 = X
- X XOR 0 = X (0 = élément neutre de XOR)
Donc, on fait un XOR avec une valeur contenant des 1 en face des bits
qu'il faut inverser et des 0 en face des bits qu'il ne faut pas changer
24
Première année / 2010
On peut aussi décaler le contenu d'une case mémoire mais il faut préciser
la taille
25
Première année / 2010
26
Première année / 2010
L'étiquette est une chaîne quelconque qui permet de repérer une ligne. Le
caractère ':' à la fin de l'étiquette n'est obligatoire que si l'étiquette est
seule sur la ligne
Branchements inconditionnels
Branchements conditionnels
Appel de fonction ou d’interruptions
27
Première année / 2010
• Branchements inconditionnels
JMP xyz Provoque un saut sans condition à la ligne portant l'étiquette xyz.
• Branchements conditionnels
JNE/JNZ xyz (Jump if Not Equal or Not Zero ) Aller à la ligne xyz si
résultat non nul ou si différent. C'est-à-dire si Z=0
28
Première année / 2010
JA xyz (Jump if Above ) aller à la ligne xyz si supérieur (non signé). C'est-
à-dire si
C+Z=0
JAE xyz (Jump if Above or Equal ) aller à la ligne xyz si supérieur ou égal
(non signé). C'est-à-dire si C = 0
JBE xyz (Jump if Bellow or Equal ) aller à la ligne xyz si inférieur ou égal
(non signé). C'est-à-dire si C + Z = 1
JNC xyz (Jump if No CArry) aller à la ligne xyz s'il n'y a pas de retenu.
C'est-à-dire si C = 0
JG xyz (Jump if Grater) aller à la ligne xyz si plus grand (signé). C'est-à-
dire si (S ⊕ O) + Z = 1
JGE xyz (Jump if Grater or Equal ) aller à la ligne xyz si plus grand ou égal
(signé). C'est-à-dire si S ⊕ O = 0
JL xyz (Jump if Less) aller à la ligne xyz si plus petit (signé). C'est-à-dire si
S⊕ O=1
JLE xyz (Jump if Less or Equal) aller à la ligne xyz si plus petit ou égal
(signé).
C'est-à-dire si (S ⊕ O) + Z = 1
JNO xyz (Jump if No Overflow) aller à la ligne xyz s'il n'y a pas de
dépassement O = 0
JP/JPE xyz (Jump if Parity or Parity Even) aller à la ligne xyz si parité
paire. C'est-àdire si P = 1
29
Première année / 2010
JNS xyz (Jump if No Sign) aller à la ligne xyz si signe positif. C'est-à-dire si
S=0
30
Première année / 2010
31
Première année / 2010
3. L’ASSEMBLEUR NASM
La syntaxe des mnémoniques que nous avons utilisée jusqu’à présent est
la syntaxe de l’assembleur NASM. Rappelons que le rôle de l’assembleur
est de convertir le programme source écrit en mnémonique en codes
machines compréhensible par le processeur.
Les directives ne sont pas des instructions du 8086, elles sont destinées à
l'assembleur qui les utilise pour savoir de quelle manière il doit travailler.
• BITS
• ORG
• SEGMENT
Cette directive précise dans quel segment, les instructions ou les données
qui la suivent seront assemblées :
SEGMENT .text
Les instructions ou les données initialisée (par db ou dw) qui suivent cette
'déclaration' seront placé dans le segment programme (Code segment)
SEGMENT .data
Les données (initialisée) déclarée après cette directive sont placée dans le
segment de données (Data segment)
SEGMENT .bss
32
Première année / 2010
• %INCLUDE
Comme en langage C, cette directive permet d'inclure un fichier source
avant la compilation.
• %DEFINE
33
Première année / 2010
mov ax,(2*x+6)/2
mov ax,x << 4
mov ax,(x >> 8)+(x << 4)
mov ax,x & x >> 4; >> est prioritaire sur &
mov ax,x | x >> 4; >> est prioritaire sur |
• Fonction 00
Paramètre :
AH = 00
34
Première année / 2010
• Fonction 09
Paramètres : AH = 09h
AL = caractère à écrire
BH = page écran
BL = attribut de couleur (RVB :111=Blanc, 000=Noir)
CX = nombre de fois
35
Première année / 2010
Les caractères spéciaux ne sont pas reconnus (le 7 ne fait pas bip). Le bit
7 de la couleur fait un ou exclusif en mode graphique et un clignotement
(uniquement en mode plein écran) en mode texte.
• Fonction 0Eh
Paramètres : AH = 0Eh
• Fonction 02
Paramètres : AH = 02h
36
Première année / 2010
BH = numéro de la page
DH = ligne (ordonnée)
DL = colonne (abscisse)
En mode 25x80 les cordonnées vont de (0,0) à (24,79).
• Fonction 05
AH = 0Ch
BH = 0 (numéro de page)
AL = couleur du pixel
si bit 7 = 1 on trace en mode XOR sauf en mode 256 couleur
CX = x (abscisse)
DX = y (ordonnée)
• Fonction 02
37
Première année / 2010
• Fonction 09
Exemple : (phrase.asm)
;*********************************************************
; affiche une phrase … l'aide de int21_fct09
;*********************************************************
BITS 16
ORG 0x0100
SEGMENT .data
txt db 'MON PREMIER PROGRAMME NASM$'
SEGMENT .text
MOV AH,9 ; fonction 9 de int21
MOV DX,txt ; adresse du début de la phrase
INT 21h ; écrit la phrase
MOV AX,4C00h ; fin programme
int 21h
Remarque :
• Fonction 07
Cette fonction permet de lire un caractère du clavier sans qu'il n'y ait
d'écho à l'écran.
Paramètre passé : AH = 07
Paramètre retourné : AL = caractère lu
Les touches fonction retourne 2 caractères, d'abord un octet nul, puis le
code étendu de la touche, il faut donc faire 2 appels consécutifs de la
fonction 07.
• Fonction 0Bh
38
Première année / 2010
• Fonction 0Ah
La mémoire vidéo est une zone mémoire qui constitue une image de
l’écran. Si on écrit quelque chose dans cette mémoire, elle apparaît à
l’écran.
39
Première année / 2010
40
Première année / 2010
41