Vous êtes sur la page 1sur 31

PROGRAMMATION EN LANGAGE

ASSEMBLEUR
Microprocesseur 8086
Invention de l'assembleur

 Avant, la programmation s'effectuait directement en binaire

c'est du "bas niveau".

 En 1950, l'invention de l'assembleur par Maurice V. Wilkes de

l'université de Cambridge ouvre la voie aux langages dits "haut


niveau".

 C'est un langage avec codes mnémotechniques (ou

mnémoniques) à la place des codes opération en binaire.

2
Langages Haut niveau
 Les langages de programmation indépendants du matériel sont

appelés des langages haut niveau.

 Aucune connaissance particulière du matériel n’est nécessaire,

car les langages haut niveau créent des programmes portables


et non liés à un ordinateur ni à une puce.

 Quelques exemples du langage haut niveau sont C, C++, Java,

PHP, Python etc.


Langages Bas niveau
 Les langages bas niveau sont utilisés pour écrire des programmes

relatifs à l’architecture et au matériel spécifiques d’un type


d’ordinateur particulier.

 Ils sont plus proches du langue maternelle d’un ordinateur (le

binaire), ce qui les rend plus difficiles à comprendre pour les


programmeurs.

 Le maitre des langages de bas niveau est l'assembleur.


Niveaux de programmation
Haut niveau
Si x est plus petit
strictement que 99,
alors incrémenter x de
1.
If(x<99)
x+=1;
cmp Ax,99
Jl dec
jmp fin
dec:
add Ax,1
fin:
011000001110010000111010
101011100000011010100100
000111100010000100100000
Bas niveau
Haut niveau vs Bas niveau
 Le langage bas niveau est un programme lisible uniquement par la
machine.
 Les langages bas niveau sont difficiles à écrire et à compiler.
 Les langages bas niveau sont compacts et nécessitent moins d’espace
mémoire.
 Les langages haut niveau utilisent des compilateurs et des
interpréteurs qui nécessitent un grand espace mémoire.
 Le débogage dans des langages haut niveau, la recherche et la
correction des erreurs sont plus faciles.
 Le codage et la compilation dans les langages bas niveau prennent
beaucoup de temps, tandis que le codage et la compilation dans les
langages haut niveau sont beaucoup plus faciles et prennent beaucoup
moins de temps à compiler.
6
Pourquoi faire de l'assembleur ?
 Créer un compilateur

 Environnements embarqués, microcontrôleurs.

 Firmware, Systèmes d'exploitation.

 Conception de langages de programmation.

 Conception matérielle (pilotes).

L'autre raison d'apprendre l'assembleur est d'acquérir une


meilleure compréhension de ce qui se passe au plus profond d'un
ordinateur.

7
Assembleur et processeur
 Chaque famille de processeurs possède son propre ensemble

d'instructions pour gérer différentes opérations, telles que la


saisie au clavier, l'affichage d'informations à l'écran et l'exécution
de diverses autres tâches.

 Ces instructions sont dits jeu d'instruction.

 Un programme écrit avec un jeu d'instruction d'une famille

donnée concerne cette dernière seulement (portabilité)

8
Évolution des processeurs Intel

Pentium: I, II, III, IV, V,


...
Processeurs x86: 8080, 8085, Processeurs multi-
8086, 8080, 80286, 80386 ... coeurs: Core 2, i5, i7,
.....
4004 Premier
processeur

1971 1972 – 1992 1993-2005 2006 jusqu’à


aujourd’hui

Le processeur 8086 d'Intel est à la base des


processeurs actuels
9
Processeur 8086 de Intel

 L'Intel 8086 est le premier microprocesseur 16 bits fabriqué

par Intel à partir de 1978.

 Processeur à architecture CISC.

 Il se présente sous forme d'un boîtier de 40 broches alimenté

par une alimentation unique de 5V.

10
Processeur 8085 (1976) vs 8086 (1978)

 Présenter le Processeur 8086 de Intel

 Étudier son jeux d'instruction.

 Apprendre à programmer en assembleur pour comprendre le

fonctionnement P 8086 .

11
Architecture interne du p 8086
Le 8086 comporte deux unités fonctionnelles qui peuvent
travailler en parallèle : unité d’ exécution (UE) et Unité
d'Interfaçage Bus (UIB)

Les deux unités fonctionnent simultanément, d’ou une


accélération du processus d’exécution d’un programme
(fonctionnement selon le principe du pipe-line).

12
Architecture interne du p 8086
Bus d’adresse Interne 20 bits
20 bits
Bus d’adresse
16 bits
Bus de contrôle
16 bits
Bus de donnée

Décodage
Contrôle
Séquenceur

Registre Instruction

Unité d’ exécution Unité d'Interfaçage Bus


UE UIB
13
Unité d'interfaçage BUS
UIB : Recherche les instructions en mémoire et les range dans une file
d’attente.

Quatre registres de segments (DS, CS, SS et ES)

Un compteur d’instruction (IP - Instruction Pointer),

Une pile (6 octets) pour stocker les instruction et données en attente.

Note : Tous les registres sont d'une largeur de 16 bits,


14
Unité d'exécution
UE : L’unité d’exécution (EU) exécute les instructions contenues dans la file
d’attente.

UAL : peut être charger par 2 registre temporaires (RT) et effectuer


des opérations sur des mots de 8 bits ou de 16 bits.

Quatre registres d'intérêt général (AX, BX, CX et DX),

Deux pointeurs de pile (SP et BP),

Deux registres d'index (SI et DI).

15
Les registres

16
Les registres généraux AX, BX, CX, DX
Les registres généraux participent aux opérations arithmétiques et logiques
ainsi qu'à l'adressage.
Chaque demi-registre est accessible comme registre de 8 bits, le 8086 peut
donc effectuer des opérations 8 bits.
Bits 15 8 7 0
H L
AX AH AL
BX BH BL
CX CH CL
DX DH DL

17
Les registres généraux
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 instruction comme compteur de répétition.
Ne peut pas servir pour l'adressage
DX : Data
Usage général
Multiplication et la division 16 bits
Ne peut pas servir pour l'adressage

18
Les registres d'adressage SP, BP, SI, DI
Ces registres (d'offset) de 16 bits permettent l'adressage d'un opérande à
l'intérieur d'un segment de 64 ko (216 positions mémoires)

SP : Pointeur de Pile
Utilisé pour l'accès à la pile. Pointe sur la tête de la pile.
Par défaut, son offset est relatif à SS

BP : Pointeur de Base
Adressage comme registre de base, (Par défaut, son offset est relatif à SS)
Usage général

19
Les registres d'adressage SP, BP, SI, DI
SI : Registre d'index (source)
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 source. L'opérande destination étant indexé par DI
Usage général

DI : Registre d'index (destination)


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.

20
Les registres de segment CS, DS, SS, ES
Ces registres 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 64Ko,
ensuite on fait varier le registre d’offset qui précise l’adresse relative par
rapport à cette position.

21
Les registres de segment CS, DS, ES, SS
CS : Code Segment
Définit le début de la mémoire programme.
Les adresses des différentes instructions du programme sont relatives à
CS.
DS : Data Segment
Début de la mémoire de données dans laquelle sont stockées toutes les
données traitées par le programme

ES : Extra Segment

Début d'un segment auxiliaire pour données

22
Les registres de segment CS, DS, SS, ES
SS : Stack Segment
Début de la pile.
La pile 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

23
Le pointeur d'instruction IP
IP : Instruction Pointer
appelé aussi Compteur Ordinal (C.O.) permet de pointer TOUJOURS
le premier octet de l’instruction suivante.

24
Le registre d'état (Flags)

Six bits reflètent les résultats d'une opération arithmétique ou logique et 3


participent au control du processeur.
C (Carry) :
Indique le dépassement de capacité sur une opération 8 bits ou 16 bits.
Ce flag peut être utilisé par des instructions de saut conditionnel, des
calculs arithmétique en chaîne ou dans des opération de rotation.
P (Parité) :
Passe à 1 si l'opération arithmétique à engendré un résultat avec un
nombre pair de bits à 1.
A (retenue Arithmétique) :
Cet indicateur est positionné à 1 si la dernière opération a généré une
retenue du bit numéro 3 vers le bit numéro 4, à 0 sinon.
25
Le registre d'état (Flags)

Z (Zéro) :
Indique que le résultat d'une opération arithmétique ou logique est nul.
Il est utilisé dans plusieurs instructions de sauts conditionnels.
S (Signe) :
Reproduit le bit de poids fort d'une quantité signée sur 8 bits ou sur 16
bits. S=0 : positif, S=1 :négatif.
L'arithmétique signée fonctionne en complément à 2.
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.

26
Le registre d'état (Flags)

I (Interruption) :
Autorise ou non la reconnaissance des interruptions
I = 0 Interruptions autorisées
I = 1 Interruptions non autorisées
D (Direction) :
Fixe la direction de l'auto-inc/décrémentation de SI et DI lors des
instruction de manipulation de chaînes.
D = 0 Incrémentation des index
D = 1 décrémentation des index
O(Overflow) :
Indique un dépassement de capacité quand on travaille avec des
nombres signés. Comme par exemple si la somme de 2 nombres positifs
donne un nombre négatif ou inversement. 27
La segmentation de la mémoire
Le mot mémoire RAM est définis sur un octet (8 bits)

Le bus d'adresse du 8086 est de taille 20 bits. On possède alors 220 entrée

d'adresses différentes dans la RAM.

La mémoire totale adressable est 220 octets=1Mo (220xMot mémoire)

La première adresse est 00000h est la dernière sera FFFFFh.

Un problème se pose, c'est comment représenter ces adresses de 20 bits

au sein du μP puisque les registres ne font que 16 bits?

28
La segmentation de la mémoire
La solution adoptée par Intel a été la suivante :
Puisque avec 16 bits on 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.

La graduation des segments se fait tous les 220 / 216 =24 Oc.

L'adresse de chaque segment est un multiple de 16 Oc.

Pour adresser une case mémoire donnée, on utilise alors deux registres :
Un registre pour adresser le segment, appelé registre segment: CS,
DS, SS, ES
Un registre pour adresser à l'intérieur du segment, appelé registre
offset: IP, SP, BP, SI, DI.
29
La segmentation de la mémoire
Une adresse se présente alors sous la forme segment : offset.

Le segment localise le début d’une zone mémoire de 64Ko.

L’offset précise l’adresse relative par rapport au début de segment

Pour calculer l'adresse absolue ou physique qui sera envoyée sur le bus

d'adresse de 20 bits, le CPU procède à l'addition des deux registres:

Adresse physique=Segment x 24 + offset

30
La segmentation de la mémoire

Exemple: La paire de registre CS:IP : pointe sur le code d'une instruction


(CS: registre segment et IP: Déplacement)
31

Vous aimerez peut-être aussi