Assembleur 2023
Assembleur 2023
Assembleur 2023
Chapitre 0
INTRODUCTION
L'apparition des microprocesseurs date du début des années 1970. A cette époque, deux événements
favorables sont apparus :
le concept de "LSI (Large Scale Integration)" permettant d'intégrer plusieurs milliers de portes
sur un même substrat.
l'arrivée à maturité de la technologie MOS caractérisée par sa faible consommation.
La conjugaison de ces événements a permis de regrouper une unité centrale d'ordinateur dans un seul
circuit intégré appelé "microprocesseur". Depuis, une multitude de composants de ce type sont apparus
au sein de familles provenant essentiellement de grands constructeurs américains : Intel, Motorola,
Advanced Micro Devices (AMD), Texas Instruments,... et japonais : NEC, Mitsubishi,...
la vitesse de fonctionnement.
la largeur des mots traités (8, 16, 32, 64 bits).
le nombre et la complexité des opérations réalisables.
L'objectif de ce cours est double : présenter les notions de base nécessaires à la compréhension
des systèmes utilisant des microprocesseurs et réaliser des travaux pratiques permettant de
programmer en langage machine (assembleur) une application d'acquisition de données.
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 2
Chapitre 1
INTRODUCTION SUR LES SYSTEMES A BASE DE MICROPROCESSEUR
I ) Architecture d'un système à base de microprocesseur :
Un système à base de microprocesseur est formé des trois éléments :
Les trois modules sont interconnectés comme le montre la figure suivante autour de trois bus : bus
de données, bus d'adresses et bus de contrôles et commandes
Bus : Il s'agit de plusieurs pistes électroniques qui sont reliées au microprocesseur. Ces bus assurent la
communication interne et externe du microprocesseur.
- Le bus de données : c'est un ensemble de fils bidirectionnels qui va permettre le transfert de données
entre les différents éléments du système. C'est par ce bus que sont transmises les données qui doivent
être traitées par le microprocesseur. A l'inverse, c'est également par ce bus que transitent les résultats en
sortie du microprocesseur. Autrement dit, toutes les données entrantes et sortantes du microprocesseur
sont véhiculées par le bus de données qui fixe la longueur du mot échangé avec la mémoire.
- Le bus de commandes et de contrôle : c'est un bus qui permet de véhiculer les signaux de contrôles et
de commandes tels que l'horloge les signaux Read/Write etc ... Ce bus sert à coordonner tous les
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 3
échanges d'informations décrits précédemment. Il véhicule des données qui valident la mémoire et les
ports d'entrées / sorties. Il introduit des délais d'attente lorsque des informations sont envoyées à un
périphérique qui présente une vitesse de traitement réduite. Le bus de commandes évite les conflits de
bus lorsque deux éléments cherchent à communiquer en même temps.
Remarque :
Dans certains cas, le bus de données et le bus d'adresses sont multiplexés sur un seul bus. Une
logique externe doit alors effectuer le démultiplexage.
Remarque :
La mémoire morte (ROM : Read Only Memory) range en général le programme d'initialisation du
système (exemple dans le PC elle range le BIOS : Basic Input Ouput Systeme).
La mémoire vive (RAM : Random Access Memory) sert au rangement des programmes utilisateurs c'est
une mémoire volatile.
- Les interfaces d'entrées sorties vont permettre au microprocesseur de communiquer avec le monde
extérieur, Nous trouvons des ports utilisés exclusivement pour l'entrée, et d'autres ports exclusivement
pour la sortie. Il existe aussi des ports bidirectionnels. Donc le microprocesseur peut lire des données à
partir d'une interface d'entrée (exemple souris, clavier disque dur, Etc. ...) de même il peut restituer le
résultat de son traitement au monde extérieur en adressent des interfaces de sortie (tel que les
imprimantes le clavier etc. ...) donc les interfaces d'entrées / sorties vont soulager le
microprocesseur pour la communication avec le monde extérieur.
Le microprocesseur doit Donc contrôler les fonctions effectuées par les autres modules, il doit chercher
ainsi que décoder des instructions ranger en mémoire, et il doit adresser des interfaces d'entrées/sorties
pour lire des données du monde extérieur, et restituer le résultat de son traitement.
► Registres.
► Circuit de contrôle.
II-1-1 ) L'accumulateur :
Il s'agit d'un registre d'usage général recevant des opérandes, des résultats intermédiaires ou des
résultats provenant de l'unité arithmétique et logique. Ils évitent des appels fréquents à la mémoire,
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 4
réduisant ainsi les temps de calcul. Donc la plupart des opérations arithmétiques et logiques se font
dans l'accumulateur.
Chaque opération que le microprocesseur va effectuer est codée (c'est-à-dire pour chaque instruction on
assigne un code qui ne peut pas être modifié ni changé par un autre code) appelé « instruction code» ou
« opération code » , pour exécuter une instruction le microprocesseur transmet l'adresse se trouvant dans
le registre compteur de programme à la mémoire , la mémoire retourne au microprocesseur l'octet
adresse par ce dernier ( le code de l'instruction) celui-ci sera stocker dans un registre appelé registre
d'instructions (RI) , donc Le registre d'instructions contient la prochaine instruction à être exécutée par
le processeur. Cette instruction sera acheminée (par un bus de données) au décodeur d'instructions qui
sera chargé de l'interpréter.
C'est lui qui va interpréter l'instruction contenue dans le registre d'instruction (RI). C'est-
à-dire qu'elle est l'opération à effectuer (Addition, branchement etc...) Et comment aller chercher
les opérandes requises pour cette opération (par exemple, les nombres à additionner). Le décodeur
d'instructions communique alors avec l'unité de commandes et de contrôles qui pourra déclencher les
événements en conséquence. Par exemple, si le décodeur d'un 8086 reçoit l'octet 10000001 (le "Add
mem/reg data"), il sait que le processeur doit aller chercher 3 autres octets en mémoire vive pour
compléter l'instruction.
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 5
II-2 ) L'unité arithmétique et logique (UAL):
Comme son nom l'indique, cette unité peut exécuter deux types d'opérations.
- Opérations arithmétiques
Elles incluent l'addition et la soustraction qui sont des opérations de base (une soustraction est une
addition avec le complément à deux), la multiplication et la division. Les données traitées sont
considérées dans des représentations entières.
- Opérations logiques
Ces opérations sont effectuées bit à bit sur les bits de même poids de deux mots, tel que ET, OU, NOT
OU EXCLUSIF, de même les opérations de rotation et de décalage (arithmétique et logique)
Elle reçoit ses opérandes (les octets qu'elle manipule) du bus de données. Celles-ci peuvent
provenir de registres ou de la mémoire. A la fin d'une opération, l'UAL peut aller modifier certains bits
du registre d'état
(FLAG). Par exemple, dans le cas du débordement d'une addition (que le résultat de l'addition est trop
grand pour entrer dans un registre), l'UAL va mettre le bit de débordement du FLAG à 1.
Synchronisée par le signal de l'horloge, c'est elle qui déclenche les événements dans le processeur (on
peut remarquer à ce sujet qu'elle est connectée à toutes les autres composantes du processeur). Par
exemple, quand une information passe dans un bus, cette information est destinée à un seul endroit (par
exemple, un registre). C'est donc l'unité de commande et de contrôle qui va "déverrouiller" l'entrée
de cette destination pour que l'information qui circule sur le bus puisse y entrer (et ne pas entrer
ailleurs en même temps).
Il s'agit donc essentiellement d'un automate exécutant les différentes séquences propres à chaque
instruction. Cet automate peut être réalisé de plusieurs façons (câbler ou micro-programmer et dans les
deux cas le jeu d'instructions est fixe). La plupart des unités de traitement sont micro- programmées et
donc à jeux d'instructions fixes.
Une interruption est signalée au processeur par un signal électrique sur une borne spéciale. Lors de la
réception de ce signal, le processeur (traite) l'interruption dès la fin de l'instruction qu'il était en train
d'exécuter. Le traitement de l'interruption consiste soit :
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 6
- à l'ignorer et passer normalement à l'instruction suivante : c'est possible uniquement pour
certaines interruptions, nommées interruptions masquables.
Il est en effet parfois nécessaire de pouvoir ignorer les interruptions pendant un certain temps, pour
effectuer des traitements très urgents par exemple. Lorsque le traitement est terminé, le processeur
démasque les interruptions et les prend alors en compte.
Remarque :
Parfois le microprocesseur est sollicité par plusieurs interruptions en même temps, pour répondre à ces
appels un ordre de priorité est souvent pris en compte pour leurs traitements.
* Interruption matérielle.
* Interruption logicielle.
Pour écrire une donnée dans la mémoire le microprocesseur doit placer l'adresse de la donnée sur
le bus d'adresses (son emplacement dans la mémoire) puis il place la donnée sur le bus de données et
enfin génère le signal WRITE (ordre d'écriture dans la mémoire).
Pour lire une donnée de la mémoire le microprocesseur doit connaître son emplacement, en effet il
dépose son adresse sur le bus d'adresses puis génère le signal READ (il demande une opération de
lecture de la mémoire) alors la donnée sera acheminée vers le microprocesseur à travers le bus de
données. La donnée sera stockée dans un registre dans le microprocesseur.
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 7
Remarque :
Si la donnée est un code opératoire d'une instruction alors elle sera logée dans le registre d'instructions
sinon elle sera logée dans un registre de données (en général l'accumulateur)
Le Wait Stat n'est qu'un temps d'attente qu'il faut donner à certains périphériques pour terminer leurs
opérations (Notamment la mémoire), en effet en général dans la plupart des systèmes à base de
microprocesseur on trouve toujours des circuits intermédiaires entre la CPU et la mémoire comme
le montre la figure suivante :
Ces circuits entraînent toujours des temps de retard supplémentaires ce qui oblige le microprocesseur à
utiliser des Wait Stat (temps de retard) pour synchroniser les transferts entre la mémoire et la CPU
.la figure précédente montre que le microprocesseur perd environ 10 ns pour avoir l'information à cause
du décodage et la bufférisation du bus.
Remarque :
Parfois le microprocesseur utilise plus qu'un seul Wait Stat pour synchroniser avec ces
périphériques (tout dépend du temps que le périphérique demande pour achever son
fonctionnement)
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 8
III- 5 /Communication avec les entrées/sorties :
Il peut s'agir d'un flux d'informations de l'extérieur vers l'ordinateur (Acquisition via le clavier, une
connexion réseau, un disque dur, etc...), ou d'un flux de l'ordinateur vers l'extérieur (écran, réseau,
disque, etc...).
Les données échangées entre un périphérique et le processeur transitent par l'interface (ou
contrôleur) associé à ce périphérique .L'interface possède de la mémoire tampon pour stocker les
données échangées (suivant le type d'interface, cette mémoire tampon fait de 1 seul octet à
quelques Méga-octets).L'interface stocke aussi des informations pour gérer la communication
avec le périphérique :
- des informations d'état, qui mémorisent la manière dont le transfert c'est effectué
(erreur de transmission, réception d'informations, etc). Ces informations sont destinées au processeur.
Lors de l'exécution des instructions d'entrées/sorties, le processeur met à 1 sa borne IO/M et présente
l'adresse E/S sur le bus d'adresse. Le signal IO/M indique aux circuits de décodage d'adresses qu'il ne
s'agit pas d'une adresse en mémoire principale, mais de l'adresse d'une interface d'entrées/sorties.
Remarque :
La communication entre le microprocesseur et les interfaces d'entrées/sorties peut être série (sur
un seul fil bit par bit) ou parallèle (sur plusieurs fils)
Lorsqu'un transfert en mémoire est nécessaire de la mémoire RAM à un port d'E/S, la CPU lit le premier
octet en mémoire et le charge dans l'un des registres du microprocesseur. La CPU écrit ensuite l'octet
rangé précédemment sur le port d'E/S approprié.
Il en résulte que le microprocesseur effectue des opérations de lecture et d'écriture répétées. Ainsi un
certain temps est perdu entre le traitement de chaque octet. Pour remédier à ce problème, une procédure
est mise au point pour l'accès direct à la mémoire (Direct Memory Access), qui permet de
transférer des données de la mémoire RAM au port d'E/S sans passer par le microprocesseur. Pour cela,
un contrôleur DMA, qui reprend le rôle de la CPU, c'est à dire qu'il gère les transferts de la RAM aux
ports d'E/S.
Chapitre 2
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 9
processeur précédent. C'est cette façon d'adapter les processeurs à chaque étape qui permet qu'un
ancien programme écrit pour un 8086 fonctionne toujours sur un nouvel ordinateur équipé d'un Pentium
Le 8086 est un circuit intégré de forme DIL de 40 pattes comme le montre la figure suivante :
Le 8086 (développé en 1978) est le premier microprocesseur de type x86.Il est équipé d'un bus de
données de 16 bits et un bus d'adresses de 20 bits et fonctionne à des fréquences diverses selon plusieurs
variantes: 5, 8 ou 10 MHz.
Nous pouvons à présent examiner plus en détail le traitement des instructions par 'UE et l'UIB. Avec le
microprocesseur 8086, le traitement des instructions se passait comme suit:
Lorsque l'exécution d'une instruction est terminée, l'UE reste inactif un court instant, pendant que
l'UIB extrait l'instruction suivante. Pour remédier à ce temps d'attente, le prétraitement ou traitement
pipeline a été introduit dans le 8086/8088. Pendant que l'UE exécute les informations qui lui sont
transmises, l'instruction suivante est chargée dans l'UIB. Les instructions qui suivront sont placées
dans une file d'attente. Lorsque l'UE a fini de traiter une instruction l'UIB lui transmet instantanément
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 10
l'instruction suivante, et charge la troisième instruction en vue de la transmettre à l'UE. De cette façon,
l'UE est continuellement en activité. Dans la figure suivante nous pouvons observer un schéma plus
détaillé de l'UE et l'UIB. Nous y retrouvons les éléments dont il a été question précédemment.
Donc en conclusion on peut dire que le 8086/8088 se compose essentiellement de deux unités : la
BIU qui fournit l'interface physique entre le microprocesseur et le monde extérieur et l'EU qui
comporte essentiellement l'UAL de 16 bits qui manipule les registre généraux de 16 bits aussi .
Remarque :
La file d'attente d'instructions contient des informations qui attendent d'être traitées par l'UE. La file
d'attente est parfois appelée capacité de traitement. Le microprocesseur 8086 est capable de
mémoriser jusqu'à six octets. Les microprocesseurs actuels sont bien entendu équipés d'une file d'attente
plus rapide et plus large, c'est à dire capable d'emmagasiner plus d'informations.
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 11
IV-2) Les registres généraux :
Les registres généraux peuvent être utilisés dans toutes les opérations arithmétiques et logiques que le
programmeur insère dans le code assembleur. Un registre complet présente une grandeur de 16 bits.
Comme le montre la figure 2, chaque registre est en réalité divisé en deux registres distincts de 8 bits.
De cette façon, nous pouvons utiliser une partie du registre si nous désirons y stocker une valeur
n'excédant pas 8 bits. Si, au contraire, la valeur que nous désirons y ranger excède 8 bits, nous
utiliserons le registre complet, c'est à dire 16 bits. Nous verrons plus loin qu'il est possible de manipuler
facilement les registres généraux.
Le programmeur dispose de 8 registres internes de 16 bits qu'on peut diviser en deux groupes comme le
montre la figure 2 :
- groupe de données : formé par 4 registres de 16 bits (AX, BX, CX et DX) chaque registre peut
être divisé en deux registres de 8 bits
- groupe de pointeur et indexe : formé de 4 registres de 16 bits (SI, DI, SP, BP) et font généralement
référence à un emplacement en mémoire.
Groupe de données :
Figure 2
Toutes les opérations de transferts de données avec les entrées-sorties ainsi que le traitement des chaînes
de caractères se font dans ce registre, de même les opérations arithmétiques et logiques.
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 12
Les conversions en BCD du résultat d'une opération arithmétique (addition, soustraction,
multiplication et la division) se font dans ce registre.
Il est utilisé pour l'adressage de données dans une zone mémoire différente de la zone code : en général
il contient une adresse de décalage par rapport à une adresse de référence. ). (Par exemple, l'adresse de
début d'un tableau). De plus il peut servir pour la conversion d'un code à un autre.
Lors de l'exécution d'une boucle on a souvent recours à un compteur de boucles pour compter le nombre
d'itérations, le registre CX a été fait pour servir comme compteur lors des instructions de boucle.
Remarque :
Le registre CL sert en tant que compteur pour les opérations de décalage et de rotation, dans ce
cas il va compter le nombre de décalages (rotation) de bits à droite ou à gauche.
Registre DX :
On utilise le registre DX pour les opérations de multiplication et de division mais surtout pour
contenir le numéro d'un port d'entrée/sortie pour adresser les interfaces d'E/S.
Un cas particulier de pointeur est le pointeur de pile (Stack Pointer : SP). Ce registre permet de pointer
la pile pour stocker des données ou des adresses selon le principe du "Dernier Entré Premier Sorti" ou
"LIFO"
Il permet de pointer la mémoire, il forme en général un décalage (un offset) par rapport à une base fixe
(le registre DS), il sert aussi pour les instructions de chaîne de caractères, en effet il pointe sur le
caractère source
Il permet aussi de pointer la mémoire il présente un décalage par rapport à une base fixe (DS ou ES), il
sert aussi pour les instructions de chaîne de caractères, il pointe alors sur la destination
Ils pointent sur la zone pile (une zone mémoire qui stocke l'information avec le principe fifo : voir plus
loin), ils présentent un décalage par rapport à la base (le registre SS). Pour le registre BP il a un rôle
proche de celui de BX, mais il est généralement utilisé avec le segment de pile.
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 13
IV -2- 3) Les registres segment:
Le 8086 a quatre registres segments de 16 bits chacun : CS (code segment, DS (Data segment),
ES (Extra segment) et SS (stack segment), ces registres sont chargés de sélectionner les différents
segments de la mémoire en pointant sur le début de chacun d'entre eux. Chaque segment de
mémoire ne peut excéder les 65535 octets.
Il pointe sur le segment qui contient les codes des instructions du programme en cours.
Remarque :
Si la taille du programme dépasse les 65535 octets alors on peut diviser le code sur plusieurs segments
(chacun ne dépasse pas les 65535 octets) et pour basculer d'une partie à une autre du programme il suffit
de changer la valeur du registre CS et de cette manière on résout le problème des programmes qui ont
une taille supérieure à 65535 octets.
Le registre segment de données pointe sur le segment des variables globales du programme, bien
évidemment la taille ne peut excéder 65535 octets (si on a des données qui dépassent cette limite, on
utilise la même astuce citée dans la remarque précédente mais dans ce cas on change la valeur de DS).
Le registre de données supplémentaires ES est utilisé par le microprocesseur lorsque l'accès aux autres
registres est devenu difficile ou impossible pour modifier des données, de même ce segment est utilisé
pour le stockage des chaînes de caractères.
Le registre SS pointe sur la pile : la pile est une zone mémoire ou on peut sauvegarder les registres ou
les adresses ou les données pour les récupérer après l'exécution d'un sous programme ou l'exécution d'un
programme d'interruption, en général il est conseillée de ne pas changer le contenu de ce registre car on
risque de perdre des informations très importantes (exemple les passages d'arguments entre le
programme principal et le sous-programme)
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 14
IV-2-4) Le registre IP : (Le compteur de programme) :
Le registre d'état FLAG sert à contenir l'état de certaines opérations effectuées par le processeur. Par
exemple, quand le résultat d'une opération est trop grand pour être contenu dans le registre cible (celui
qui doit contenir le résultat de l'opération), un bit spécifique du registre d'état (le bit OF) est mis à 1 pour
indiquer le débordement.
Les drapeaux sont des indicateurs qui annoncent une condition particulière suite à une opération
arithmétique ou logique.
Remarque :
CF (Carry Flag) :
Retenue : cet indicateur est mis à 1 lorsque il y a une retenue du résultat à 8 ou 16 bits. Il
intervient dans les opérations d'additions (retenue) et de soustractions (borrow) sur des entiers
naturels. Il est positionné en particulier par les instructions ADD, SUB et CMP
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 15
CF = 1 s'il y a une retenue après l'addition ou la soustraction du bit de poids fort des opérandes.
Exemples (sur 8 bits pour simplifier) :
PF (Parity Flag) :
Parité : si le résultat de l'opération contient un nombre pair de 1 cet indicateur est mis à 1, sinon zéro.
AF (Auxiliary Flag) :
Demi-retenue : Ce bit est égal à 1 si on a une retenue du quartet de poids faible dans le quartet de
poids plus fort.
ZF (Zero Flag) :
Zéro : Cet indicateur est mis à 1 quand le résultat d'une opération est égal à zéro. Lorsque l'on vient
d'effectuer une soustraction (ou une comparaison), ZF=1 indique que les deux opérandes étaient
égaux. Sinon, ZF est positionné à 0.
SF (Sign Flag) :
SF est positionné à 1 si le bit de poids fort du résultat d'une addition ou soustraction est 1 ; sinon SF=0.
SF est utile lorsque l'on manipule des entiers signés, car le bit de poids fort donne alors le signe du
résultat. Exemples (sur 8 bits) :
OF (Overflow Flag) :
Débordement : si on a un débordement arithmétique ce bit est mis à 1.c a d le résultat d'une opération
excède la capacité de l'opérande (registre ou case mémoire), sinon il est à 0.
DF (Direction Flag) :
IF (Interrupt Flag) :
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 16
Masque d'interruption : pour masquer les interruptions venant de l'extérieur ce bit est mis à 0, dans
le cas contraire le microprocesseur reconnaît l'interruption de l'extérieur.
TF (Trap Flag) :
Remarque :
Les instructions de branchements conditionnels utilisent les indicateurs (drapeaux), qui sont des
bits spéciaux positionnés par l'UAL après certaines opérations. Chaque indicateur est manipulé
individuellement par des instructions spécifiques.
V) Gestion de la mémoire :
V-1) Introduction :
L'espace mémoire adressable (1 méga = 220 bits du bus d'adresse) du 8086/8088 est divisé en quatre
segment logiques allant jusqu'à 64 K Octets chacun. L'accès à ces espaces est direct et simultané, or Le
compteur de programme est de 16 bits donc la possibilité d'adressage est de 216 = 64 Ko (Ce qui ne
couvre pas la totalité de la mémoire), alors on utilise deux registres pour indiquer une adresse au
processeur, Chaque segment débute à l'endroit spécifié par le registre segment. Le déplacement
(offset) à l'intérieur de chaque segment se fait par un registre de décalage qui permet de trouver une
information à l'intérieur du segment. Exemple la paire de registre CS:IP : pointe sur le code d'une
instruction (CS registre segment et IP Déplacement)
Nous abordons ici le problème de la segmentation de la mémoire. Nous venons de voir qu'en
assembleur, les données étaient normalement regroupées dans une zone mémoire nommée segment
de données, tandis que les instructions étaient placées dans un segment d'instructions (de même pour le
segment pile et segment de données supplémentaires). Ce partage se fonde sur la notion plus générale de
segment de mémoire, qui est à la base du mécanisme de gestion des adresses par les processeurs 80x86.
On a vu aussi que le registre IP, qui stocke l'adresse d'une instruction, fait lui aussi 16 bits. Or, avec 16
bits il n'est possible d'adresser que 2 16 = 64 Kilo octets. Le bus d'adresses du 8086 possède 20 bits. Cette
adresse de 20 bits est formée par la juxtaposition d'un registre segment (16 bits de poids fort) et d'un
déplacement (offset, 16 bits de poids faible). Adresse physique= Base * 16+ offset
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 17
Le schéma de la figure suivante illustre la formation d'une adresse 20 bits à partir du segment et du
déplacement sur 16 bits :
Remarque :
On appellera segment de mémoire une zone mémoire adressable avec une valeur fixée du segment (les
16 bits de poids fort). Un segment a donc une taille maximale de 64 Ko.
Le pointeur de pile (en combinaison avec le segment de pile SS) pointe vers le dessus de la pile (TOS :
top of stack) en mémoire. Une pile est un ensemble de données placées en mémoire de manière à ce que
seulement la donnée du "dessus" soit disponible à un instant donné. Pour aller chercher la donnée sous
celle du dessus par exemple, on doit d'abord enlever celle du dessus. Le rôle du pointeur de pile (et de la
pile vers laquelle il pointe) est le suivant. Quand un processeur exécute une instruction, il est possible
qu'il soit interrompu par une "Interruption" (c'est-à-dire un appel au processeur qui est prioritaire aux
instructions du programme qu'il traite). Il doit alors arrêter de s'occuper de l'instruction qu'il traite
présentement pour s'occuper de l'interruption. Quand l'interruption sera traitée, il retournera à
l'instruction qu'il traitait quand il a été interrompu. Mais pour cela, il doit se rappeler de cette instruction
ainsi que de l'état de certains registres au moment où il traitait l'instruction. Donc pour ne pas les perdre,
il les placera temporairement dans une pile (à l'intérieur de la mémoire RAM par exemple) et pourra les
récupérer une fois l'interruption traitée. Le pointeur de pile (SP) donne donc l'adresse en mémoire de
cette pile temporaire.
Les piles offrent un nouveau moyen d'accéder à des données en mémoire principale, qui est très
utilisé pour stocker temporairement des valeurs.
Le schéma suivant montre comment une valeur est stocker dans la pile (pushed) et comment elle est
récupérée (poped) :
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 18
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 19
Les bits D0..D7 sont appelés partie basse alors que les bits D8…D15 sont appelés partie haute. Le 8086
peut charger un octet (8 bits) ou un mot (16 bits) ou un double mot (32 bits) de la mémoire, en effet pour
l'octet il suffit de donner l'adresse de ce dernier pour être chargé dans la CPU, pour le mot il suffit de
donner l'adresse, le 8086 cherche l'octet du poids faible à l'adresse donnée et l'octet du poids le plus fort
à l'adresse qui suit , mais un problème apparaît lorsque on veut accéder à une case mémoire impaire
tel que 135 par exemple , en effet :
La figure suivante montre comment les cases sont rangées dans les deux banks :
Si on veut accéder par exemple à l'octet (8 bits) d'une adresse paire celle ci sera directement
transmise sur les lignes D0...D7 mais si on veut accéder à une adresse impaire tel que 135 par
exemple, donc il faut aussi que la donnée serait charger sur les lignes D0.. D7, or en réalité et en
regardant l'organisation de la mémoire et par la figure précédente on constate que la donnée sera
transmise sur les lignes D8..D15 (adresse impaire) ce qui va obliger le microprocesseur de
changer cette octet du poids haut au poids faible d'une manière automatique.
Si on veut accéder à un mot : si l'adresse est paire on n'aura pas de problème le pois faible sera
chargé sur les lignes D0...D7 et le pois fort sera chargé sur les lignes D8...D15 donc l'accès à la
mémoire se fait avec un seul cycle .mais si on veut accéder à un mot logé dans une case impaire
tel que 135 par exemple alors il nous faut deux cycles pour charger la donnée en effet
l'organisation de la mémoire nous donne la disposition suivante :
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 20
Donc le microprocesseur doit accéder à la mémoire en deux temps le premier pour chercher l'octet 135
et le deuxième pour chercher l'octet haut à partir de l'adresse 136.de plus il doit permuter ces deux octet
pour avoir le poids faible sur les lignes D0...D7 et le poids fort sur les lignes D8...D15.
Remarque :
Pour sélectionner les banks pair et impair le microprocesseur utilise deux signaux (BHE et A0 : le
premier bit du bus d'adresse) comme le montre la figure suivante :
Chapitre 3
PROGRAMMATION EN ASSEMBLEUR
I) Introduction :
Lorsque l'on doit lire ou écrire un programme en langage machine, il est difficile d'utiliser la notation
hexadécimale. On écrit les programmes à l'aide des instructions en mnémonique comme MOV,
ADD, etc. Les concepteurs de processeurs, comme Intel, fournissent toujours une
documentation avec les codes des instructions de leurs processeurs, et les symboles correspondantes.
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 21
L'assembleur est un utilitaire qui n'est pas interactif, (contrairement à l'utilitaire comme debug : voir plus
loin dans le cours). Le programme que l'on désire traduire en langage machine (on dit assembler) doit
être placé dans un fichier texte (avec l'extension .ASM sous DOS).
L'opération d'assemblage traduit chaque instruction du programme source en une instruction machine.
Le résultat de l'assemblage est enregistré dans un fichier avec l'extension .OBJ (fichier objet).
Le fichier .OBJ n'est pas directement exécutable. En effet, il arrive fréquemment que l'on construise
un programme exécutable à partir de plusieurs fichiers sources. Il faut (relier) les fichiers objets à
l'aide d'un utilitaire nommé éditeur de lien (même si l'on a qu'un seul). L'éditeur de liens fabrique un
fichier exécutable, avec l'extension .EXE.
Le fichier .EXE est directement exécutable. Un utilitaire spécial du système d'exploitation (DOS ici), le
chargeur est responsable de la lecture du fichier exécutable, de son implantation en mémoire
principale, puis du lancement du programme.
Donc en conclusion pour assembler un programme on doit passer par les phases suivantes :
- Editer les liens pour avoir un programme exécutable. Les trois phases sont schématisées par la figure
suivante :
Remarque 1 :
On ne peut passer du code source vers le code objet que si le programme source ne présente
aucune erreur.
La saisie se fait par des logiciels qui s'appellent éditeurs de texte, donc on peut utiliser n'importe
quel éditeur de textes (tel que EDLINE sous MSDOS de Microsoft) sauf les éditeurs sous
Windows car ces éditeurs ajoutent dans le fichier des informations (la taille des
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 22
caractères, la police utilisée, la couleur etc...) que l'assembleur ne peut pas comprendre .Pour
utiliser les éditeurs sous Windows il est conseiller d'enregistrer les fichiers sous forme RTF.
Editeur de lien :
Plusieurs logiciels permettent le passage entre les trois phases présentée dans la figure précédente on
peut citer : MASM (Microsoft Assembler : avec LINK comme éditeur de lien), TASM (Turbo
assembler : avec TLINK comme éditeur de lien) et NASM etc ...
Les données sont déclarées par des directives, mots clefs spéciaux que comprend l'assembleur (donc
ils sont destinés à l'assembleur. Les instructions (sont destinées au microprocesseur)
- Le champ opérande est un champ optionnel selon l'instruction (parfois l'instruction nécessite une
opérande et parfois non).
Remarque :
- Le champ Label (étiquette) est destiné pour marquer une ligne qui sera la cible d'une instruction de saut
ou de branchement. Un label peut être formé par 31 caractère alphanumérique ({A.. Z} {a.. z} {0.. 9}
{.?@_$}) au maximum .Les noms des registres ainsi que la représentation mnémonique des instructions
et les directives (voir plus loin) ne peuvent être utilisées comme Label. Le champ Label doit se
terminer par ' : ' et ne peut commencer par un chiffre. De même il n'y a pas de distinction
entre minuscules et majuscules.
Exemple :
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 23
ET1 : MOV AX, 500H ; mettre la valeur 500 H dans le registre AX
Pour programmer en assembleur, on doit utiliser, en plus des instructions assembleur, des
directives ou pseudo-instructions : Une directive est une information que le programmeur fournit au
compilateur. Elle n'est pas transformée en une instruction en langage machine. Elle n'ajoute donc aucun
octet au programme compilé. Donc les directives sont des déclarations qui vont guider l'assembleur.
Une directive est utilisée par exemple pour créer de l'espace mémoire pour des variables, pour définir
des constantes, etc...
Exemples :
Ces directives sont utilisées pour déclarer les variables : L'assembleur attribue à chaque variable une
adresse. Dans le programme, on repère les variables grâce à leurs noms. Les noms des variables sont
composés d'une suite de 31 caractères au maximum, commençant obligatoirement par une lettre. Le nom
peut comporter des majuscules, des minuscules, des chiffres, plus les caractères @, et _. Lors de la
déclaration d'une variable, on peut lui affecter une valeur initiale.
a°) DB (Define byte): définit une variable de 8 bits : c a d elle réserve un espace mémoire d'un octet :
donc les valeurs qu'on peut stocker pour cette directive sont comprises entre 0 et 255 (pour les nombres
non signés) et de -128 jusqu'à 127 pour les nombres signés.
Exemple :
Vil DB 12H ; Définit une variable (un octet) de valeur Initiale 12.
TAB DB 18H, 15H, 13H ; définit un tableau de 3 cases
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 24
;(3 octet) Qui démarre à partir de l'adresse TAB.
Mess DB 'ISET' ; définit aussi un tableau mais les valeurs de chaque case
;n'est autre que le code ascii de chaque lettre
b°) DW (define word) : définit une variable de 16 bits : c a d elle réserve un espace mémoire d'un mot :
donc les valeurs qu'on peut stocker pour cette directive sont comprises entre 0 et 65535 (pour les
nombres non signés) et de -32768 jusqu'à 32767 pour les nombres signés .
Exemple :
Exemple :
ff DD 15500000H
Lorsque l'on veut déclarer un tableau de n cases, toutes initialisées à la même valeur, on utilise la
directive dup:
Dans certains cas, l'adressage indirect est ambigu. Par exemple, si l'on
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 25
écrit :
L'assembleur ne sait pas si l'instruction concerne 1, 2 ou 4 octets consécutifs. Afin de lever l'ambiguïté,
on doit utiliser une directive spécifiant la taille de la donnée à transférer :
- Associer les symboles représentant des adresses à un segment en considérant leur valeur comme un
déplacement par rapport au début du segment.
- spécifier des directives pour l'éditeur de lien (nom du segment, champs d'opérande de l'instruction
SEGMENT déterminant le traitement du segment par l'éditeur de liens); ces informations sont passées
telles quelles.
Nom SEGMENT
Opérande .
Nom ENDS
* L'instruction SEGMENT permet de re-ouvrir un segment déjà existant (donc, SEGMENT soit
créer un nouveau segment, soit ouvrir un segment en vue d'y ajouter du code supplémentaire).
Remarque :
Il ne faut pas oublier l'instruction ENDS avant une telle opération, elle permet de (temporairement) clore
l'ancien segment.
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 26
Les opérandes de l'instruction SEGMENT déterminent la manière dont l'éditeur de liens traitera le
segment :
COMMON :
Tous les segments avec l'étiquette (classe) seront placés à la même adresse de base (dans un bloc
contigu) ; des zones du type (COMMON) avec différents noms ((classe)) seront placés l'un derrière
l'autre.
PUBLIC :
Tous les segments avec ce qualificatif seront regroupés dans un seul segment résultant, l'un
derrière l'autre.
STACK :
Un seul segment avec ce qualificatif est accepté, il est destiné à la gestion de la pile.
MEMORY :
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 27
Le premier segment portant ce qualificatif sera placé à une position de mémoire en dessus de tout autre
segment; s'il y a d'avantage de segments de ce genre, ils seront traités comme les segments du type
(COMMON).
Il est possible de contrôler la manière dont l'éditeur de liens détermine l'adresse ou sera placé un
segment: on choisit l'alignement du segment (c.à.d. de son premier byte).
Les données sont déclarées par des directives, Les directives qui déclarent des données sont
regroupées dans les segments de données, qui sont délimités par les directives SEGMENT et ENDS.
Les instructions sont placées dans un autre segment, le segment de code. La ligne :
Code SEGMENT sert à déclarer le segment code. On aurait aussi bien pu le nommer
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 28
(iset) ou (microprocesseur). Ce sera le segment de notre programme. Cette ligne ne sera pas compilée :
elle ne sert qu'à indiquer au compilateur le début d'un segment.
La ligne :
PROG
La première instruction du programme (dans le segment d'instruction) doit toujours être repérée par une
étiquette (dans notre cas : PROG). Le fichier doit se terminer par la directive END avec le nom de
l'étiquette de la première instruction (ceci permet d'indiquer à l'éditeur de liens qu'elle est la première
instruction à exécuter lorsque l'on lance le programme).
Comme nous l'avons vu, les directives SEGMENT et ENDS permettent de définir les segments de codes
et de données. La directive ASSUME permet d'indiquer à l'assembleur quel est le segment de données et
celui de codes (etc...), afin qu'il génère des adresses correctes. Enfin, le programme doit commencer,
avant toute référence au segment de données, par initialiser le registre segment DS (même chose pour :
ES et SS), de la façon suivante :
Remarque:
On n'est pas tenu de rendre aux registres la valeur qu'ils avaient au début de notre programme. En effet,
avant de charger un programme, le DOS sauvegarde le contenu de tous les registres puis met le contenu
des registres généraux (ainsi que SI, DI et BP) à zéro. Il les restaurera quand il prend la main.
La différence fondamentale est que les programmes COM ne peuvent pas utiliser plus d'un segment dans
la mémoire. Leur taille est ainsi limitée à 64 Ko. Les programmes EXE ne sont quant à eux limités que
par la mémoire disponible dans l'ordinateur.
Le mot clef PROC commence la définition d'une procédure, near indiquant qu'il s'agit d'une procédure
située dans le même segment d'instructions que le programme appelant.
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 29
VI) Les modes d'adressage du 8086:
Les instructions et leurs opérandes (paramètres) sont stockées en mémoire principale. La taille
totale d'une instruction (nombre de bits nécessaires pour la représenter en mémoire) dépend du type
d'instruction et aussi du type d'opérande. Chaque instruction est toujours codée sur un nombre entier
d'octets, afin de faciliter son décodage par le processeur.
- le champ opérande qui contient la donnée, ou la référence à une donnée en mémoire (son adresse).
Les façons de désigner les opérandes constituent les "modes d'adressage". Selon la manière
dont l'opérande (la donnée) est spécifié, c'est à dire selon le mode d'adressage de la donnée, une
instruction sera codée par 1, 2, 3 ou 4 octets.
Ce mode d'adressage concerne tout transfert ou toute opération, entre deux registres de même taille.
Exemple :
Mov AX, BX ; cela signifie que l'opérande stocker dans le registre BX sera transféré vers le registre
AX. Quand on utilise l'adressage registre, le microprocesseur effectue toutes les opérations d'une façon
interne. Donc dans ce mode il n'y a pas d'échange avec la mémoire, ce qui augmente la vitesse de
traitement de l'opérande.
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 30
Dans ce mode d'adressage l'opérande apparaît dans l'instruction elle- même, exemple :
MOV AX, 500H ; cela signifie que la valeur 500H sera stockée immédiatement dans le registre AX
Remarque :
MOV AX,adr
La valeur adr est une constante (un déplacement) qui doit être ajouté au contenu du registre DS pour
former l'adresse physique de 20 bits.
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 31
Remarque :
En général le déplacement est ajouté par défaut avec le registre segment DS pour former l'adresse
physique de 20 bits, mais il faut signaler qu'on peut utiliser ce mode d'adressage avec d'autres registres
segment tel que ES par exemple, seule la syntaxe en mnémonique de l'instruction change et devient :
Dans ce mode d'adressage l'adresse de l'opérande est stockée dans un registre qu'il faut bien évidemment
le charger au préalable par la bonne adresse. L'adresse de l'opérande sera stockée dans un registre de
base (BX ou BP) ou un index (SI ou DI).
Exemple :
Le contenu de la case mémoire dont l'adresse se trouve dans le registre BX (c.a.d : Adr) est mis
dans le registre AX
Remarque:
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 32
VI - 5) Mode d'adressage relatif à une base :
Dans ce mode d'adressage Le déplacement est déterminé par soit, le contenu de BX, soit le contenu de
BP, auquel est éventuellement ajouté un décalage sur 8 ou 16 bits signé. DS et SS sont pris par défaut.
Exemple :
MOV AX,[BX]+2
Cela signifie que dans le registre AX on va mettre le contenu de la case mémoire pointe par BX+2
Remarque :
Adressage indexé
Ex : MOV [SI][BX], AX ;
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 33
Chapitre 4
LE JEU D'INSTRUCTIONS DU 8086/8088
I) introduction :
On peut diviser les instructions du 8086/88 en 6 groupes comme suit :
II-1-1) MOV :
Elle permet de transférer les données (un octet ou un mot) d'un registre à un autre registre ou d'un
registre à une case mémoire, sa syntaxe est comme suit :
Exemples :
MOV destination, source
MOV AX, BX ; Transfert d'un registre de 16 bits vers un registre de 16 Bits
MOV AH, CL ; Transfert d'un registre de 8 bits vers un registre de 8 bits
MOV AX, Val1 ; Transfert du contenu d'une case mémoire 16 bits vers AX
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 34
MOV Val2, AL ; Transfert du contenu du AL vers une case mémoire D'adresse Val2
Remarque:
Il est strictement interdit de transférer le contenu d'une case mémoire vers une autre case
mémoire comme suit
On n'a pas le droit aussi de transférer un registre segment vers un autre registre segment sans
passer par un autre registre :
MOV DS, ES
MOV AX, ES
MOV DS, AX
II-1-2) PUSH :
Exemple :
II-1-3) POP :
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 35
Exemple :
II-1-4) PUSHA :
Cette instruction permet d'empiler la totalité des registres internes du microprocesseur sur la pile.
II-1-5) POPA :
Cette instruction permet de dépiler la totalité des registres internes du microprocesseur sur la pile.
II-1-6) XCHG :
II-1-7) XLAT :
Cette instruction est utilisée pour convertir des données d'un code à un autre, en effet elle permet de
placer dans l'accumulateur AL le contenu de la case mémoire adressée en adressage base+décalage (8
bits), la base étant le registre BX et le décalage étant AL lui-même dans le segment DS
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 36
Exemple :
Tab db ‘0123456789ABCDEF'
MOV AL,1110B ; chargement de la valeur à convertir (07)
MOV BX, OFFSET TAB ; pointé sur le tableau
XLAT ; Al est chargé par le code ASCII de ‘E'
II-2-1 ) IN ) OUT:
Elle permet de récupérer des données d'un port (donc de la périphérie) ou restituer des données à un
port, dans les deux cas s'il s'agit d'envoyer ou de recevoir un octet on utilise l'accumulateur AL, s'il s'agit
d'envoyer ou de recevoir un mot on utilise l'accumulateur AX.
Syntaxe :
IN ACCUMULATEUR, DX
OUT DX, ACCUMULATEUR
Remarque :
Exemple :
Exemple :
Au lieu de faire :
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 37
LDS BX, tab_val ;elle charge automatiquement l'offset de tab_val dans le registre BX
;et le segment dans le registre DS .
Remarque :
SAHF : Store AH into Flags : Place le contenu de AH dans l'octet de poids faible du registre d'état
(FLAGS).
Les instructions arithmétiques sont divisées en quatre sous-groupes comme le montre le tableau suivant :
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 38
III-1) Addition:
Elle permet d'additionner le contenu de la source (octet ou un mot) avec celui de la destination le résultat
est mis dans la destination
Exemples :
ADD AX, BX ; AX = AX + BX (addition sur 16 bits) ADD AL,BH
; AL = AL + BH (addition sur 8 bits)
ADD AL, [SI] ; AL = AL + le contenu de la case mémoire
; pointé par SI
ADD [DI], AL ; le contenu de la case mémoire pointé par DI
; Est additionnée avec AL, le résultat est mis
; dans la case mémoire pointé par DI
Remarques :
Ici on a presque les mêmes restrictions de l'instruction MOV c.a.d on n'a pas le droit
d'additionner deux cases mémoires sans utiliser un registre de données.
Exemples :
ADD Tab1 , Tab2
MOV AX , Tab2
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 39
ADD Tab1 , AX
Elle permet d'additionner le contenu de la source (octet ou un mot) avec celui de la destination et la
retenue (CF) le résultat est mis dans la destination
Exemples :
ADC AX,BX ; AX = AX + BX + CF(addition sur 16 bits )
ADC AL,BH ; AL = AL + BH + CF(addition sur 8 bits )
ADC AL,[SI] ; AL = AL + le contenu de la case mémoire pointé par SI + CF
ADC [DI],AL ; le contenu de la case mémoire pointé par DI
; est additionné avec AL + CF , le résultat est mis dans la case mémoire pointé par DI
Remarque :
Exemples :
INC AX ; AX = AX + 1 (incrémentation sur 16 bits).
INC AL ; AL = AL +1 (incrémentation sur 8 bits).
INC [SI] ; [SI] = [SI] + 1 le contenu de la case mémoire pointé par SI sera incrémenter
Remarque :
- Si non :
Elle ajoute 6 à AL
Ajoute 1 à AH
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 40
Efface le quarter haut de AL
Met AF et CF à 1 (pour information)
III-2) Soustraction :
Elle permet de soustraire la destination de la source (octet ou un mot) le résultat est mis dans la
destination
Exemples :
SUB AX,BX ; AX = AX - BX (Soustraction sur 16 bits )
SUB AL,BH ; AL = AL - BH ( Soustraction sur 8 bits )
SUB AL,[SI] ; AL = AL - le contenu de la case mémoire pointé par SI
SUB [DI],AL ; le contenu de la case mémoire pointé par DI
; est soustraite de AL , le résultat est mis
; dans la case mémoire pointé par DI
Remarques :
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 41
On a les mêmes restrictions de l'instruction ADD.
Elle permet de soustraire la destination de la source et la retenue (octet ou un mot) le résultat est
mis dans la destination
Exemples :
SBB AX,BX ; AX = AX-BX - CF (Soustraction sur 16 bits )
SBB AL,BH ; AL = AL - BH - CF( Soustraction sur 8 bits )
SBB AL,[SI] ; AL = AL - le contenu de la case mémoire
; pointé par SI - CF
SBB [DI],AL ; le contenu de la case mémoire pointé par DI
; est soustraite avec AL - CF, le résultat est mis dans la case mémoire pointé par DI
Remarques :
Exemples :
DEC AX ; AX = AX - 1 (décrémentation sur 16 bits).
DEC AL ; AL = AL -1 (décrémentation sur 8 bits).
DEC [SI] ; [SI] = [SI] - 1 le contenu de la case mémoire
; pointé par SI sera décrémenter
Remarque :
Elle soustrait l'opérande destination (octet ou mot) de 0 le résultat est stocker dans la destination,
donc avec cette opération on réalise le complément à deux d'un nombre
Exemples :
NEG AX ; AX = 0 - AX
NEG AL ; AL = 0 - AL
NEG [SI] ; [SI] = 0 - [SI]
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 42
Remarque :
Les indicateurs affectés par cette opération sont : AF, CF, OF, PF, SF, ZF
Elle soustrait la source de la destination , qui peut être un octet ou un mot , le résultat n'est pas mis dans
la destination , en effet cette instruction touche uniquement les indicateurs pour être tester avec une
autre instruction ultérieure de saut conditionnel
Les indicateurs susceptibles d'être touché sont : AF, CF, OF, PF, SF, ZF
Donc cette instruction va nous permettre de comparer deux nombres comme le montre le tableau suivant
:
III-3) La multiplication :
-Si la source est un octet alors elle sera multipliée par l'accumulateur AL le résultat sur 16 bits
sera stocké dans le registre AX.
Si la source est un mot alors elle sera multipliée avec l'accumulateur AX le résultat de 32
bits sera stocké dans la paire des registres AX et DX
Remarque :
Cette multiplication traite les données en tant que nombres non signés
Donc on aura :
En conclusion :
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 43
Remarque :
Exemple :
MOV AL , 6
MOV DL , 8
MUL DL
AAM
III-4) La division :
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 44
Elle effectue une division non signée de l'accumulateur par l'opérande source :
Exemples :
Si l'opérande est un octet : alors on récupère le quotient dans le registre AL et le reste dans le
registre AH.
Si l'opérande est un mot : alors on récupère le quotient dans le registre AX et le reste dans le
registre DX
A/
MOV AH,00h
MOV AL,33H
MOV DL,25H
DIV DL ; Cela implique que AH= et AL =
B/
MOV AX,500H
MOV CX,200H
DIV CX ;Cela implique que AX= et AL =
Si l'opérande est un octet : alors on récupère le quotient dans le registre AL et le reste dans le
registre AH.
Si l'opérande est un mot : alors on récupère le quotient dans le registre AX et le reste dans le
registre DX
Exemples:
A/
MOV AH,00h
MOV AL,-33H
MOV DL,25H
IDIV DL ; Cela implique que AH= et AL =
B/
MOV AX,-500H
MOV CX,200H
IDIV CX ; Cela implique que AX= et AL =
Remarque :
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 45
III-4-4) CBW (convert byte to word)
Cette instruction permet de doubler la taille de l'opérande signé
Remarque :
Exemple :
MOV AL, +96 ; AL=0110 0000
CBW ; AH=0000 0000 et AL=0110 0000
Remarque :
Exemple :
MOV AX, +260 ; AX=0000 0001 0000 0100
CWD ; DX=0000H, AX=0104H
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 46
Exemple :
MOV AX, 500 H ; AX = 0000 0101 0000 0000
NOT AX ; AX = 1111 1010 1111 1111
Elle permet de faire un ET logique entre la destination et la source (octet ou un mot) le résultat est mis
dans la destination
Exemples :
MOV AX , 503H ; AX = 0000 0101 0000 0011
AND AX , 0201H ; 0000 0101 0000 0011
; AND 0000 0010 0000 0001
; = 0000 0000 0000 0001
AND AX,BX ; AX = AX . BX (Et logique entre AX et BX)
AND AL,BH ; AL = AL . BH (ET logique sur 8 bits)
AND AL,[SI] ; AL = AL AND le contenu de la case mémoire
; pointé par SI
AND [DI],AL ; ET logique entre la case mémoire pointé par
; DI et AL , le résultat est mis dans la case
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 47
; mémoire pointé par DI
Elle permet de faire un OU logique entre la destination et la source (octet ou un mot) le résultat est mis
dans la destination
Exemples :
MOV AX , 503H ; AX = 0000 0101 0000 0011
OR AX , 0201H ; 0000 0101 0000 0011
; OR 0000 0010 0000 0001
; = 0000 0111 0000 0011
OR AX,BX ; AX = AX + BX ( OU logique entre AX et BX )
OR AL,BH ; AL = AL + BH ( OU logique sur 8 bits )
OR AL,[SI] ; AL = AL OU le contenu de la case mémoire
; pointé par SI
OR [DI],AL ; OR logique entre la case mémoire pointé par
; DI et AL, le résultat est mis dans la case
; mémoire pointé par DI
Elle permet de faire un OU exclusif logique entre la destination et la source (octet ou un mot) le résultat
est mis dans la destination
Exemples :
MOV AX , 503H ; AX = 0000 0101 0000 0011
XOR AX , 0201H ; 0000 0101 0000 0011
; XOR 0000 0010 0000 0001
; = 0000 0111 0000 0010
XOR AX,BX ; AX = AX + BX (OU exclusif entre AX et BX )
XOR AL,BH ; AL = AL + BH ( OU exclusif sur 8 bits )
XOR AL,[SI] ; AL = AL OU exclusif le contenu de la case
; Mémoire pointé par SI
XOR [DI],AL ; XOR logique entre la case mémoire pointé par
; DI et AL, le résultat est mis dans la case
; mémoire pointé par DI
IV-1-5) TEST :
Syntaxe : TEST Destination, source
Elle permet de faire un ET logique entre la destination et la source (octet ou un mot) mais la destination
ne sera pas touchée en effet cette instruction ne touche que les indicateurs.
Exemples :
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 48
MOV AX, 503H ; AX = 0000 0101 0000 0011
TEST AX, 0201H ; 0000 0101 0000 0011
Elle va effectuer un ET logique entre le premier nombre et le second sans toucher les deux mais elle va
affecter uniquement les indicateurs (Flags)
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 49
Exemple :
ROR AX,1
ROL AL,1
ROR AL,1
ROR AL,1
ROR AL,1
ROR AL,1
Ou encore :
MOV CL,4
ROR AL,CL
Remarque :
Les instructions de rotations et de décalages logiques ne tiennent pas compte du bit de signe donc elles
travaillent avec les nombres non signés.
Les instructions de rotations et de décalages arithmétiques préservent le bit de signe donc elles sont
réservées aux nombres signés.
Remarque :
Ces instructions n'affectent pas les Flags. Dans cette catégorie on trouve toutes les instructions de
branchement, de boucle et d'interruption après un branchement, le tableau suivant donne ces instructions
:
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 50
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 51
La procédure est nommée calcul. Après l'instruction B, le processeur passe à l'instruction C de la
procédure, puis continue jusqu'à rencontrer RET et revient à l'instruction D.
Une procédure est une suite d'instructions effectuant une action précise, qui sont regroupées par
commodité et pour éviter d'avoir à les écrire à plusieurs reprises dans le programme.
Les procédures sont repérées par l'adresse de leur première instruction, à laquelle on associe une
étiquette en assembleur.
L'exécution d'une procédure est déclenchée par un programme appelant. Une procédure peut elle-même
appeler une autre procédure, et ainsi de suite.
CALL adresse_debut_procedure
L'adresse est sur 16 bits, la procédure est donc dans le même segment d'instructions. CALL est une
nouvelle instruction de branchement inconditionnel. La fin d'une procédure est marquée par
l'instruction RET :
V-1-2) RET :
RET ne prend pas d'argument ; le processeur passe à l'instruction placée immédiatement après le CALL.
RET est aussi une instruction de branchement : le registre IP est modifié pour revenir à la valeur qu'il
avait avant l'appel par CALL. Comment le processeur retrouve-t-il cette valeur ? Le problème est
compliqué par le fait que l'on peut avoir un nombre quelconque d'appels imbriqués, comme sur la figure
suivante :
L'adresse de retour, utilisée par RET, est en fait sauvegardée sur la pile par l'instruction CALL. Lorsque
le processeur exécute l'instruction RET, il dépile l'adresse sur la pile (comme POP), et la range dans IP.
Empiler la valeur de IP. A ce moment, IP pointe sur l'instruction qui suit le CALL.
Placer dans IP l'adresse de la première instruction de la procédure (donnée en argument).
Et l'instruction RET :
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 52
Dépiler une valeur et la ranger dans IP.
Remarque 1 :
Si la procédure appartient au même segment que le programme principal elle est dite de type
NEAR sinon elle est dite de type FAR, la différence entre eux c'est que dans le premier cas le processeur
doit empiler une seule valeur dans la pile c'est le registre IP mais dans le deuxième cas il faut empiler le
registre IP ainsi que le registre segment CS et bien sur il les dépiler pendant le retour de la procédure.
(paramètres) qui sont fournies par le programme appelant, et produit un résultat qui est transmis à ce
programme. Plusieurs stratégies peuvent être employées :
1. Passage par registre : les valeurs des paramètres sont contenues dans des registres du processeur.
C'est une méthode simple, mais qui ne convient que si le nombre de paramètres est petit (il y a peu de
registres).
2. Passage par la pile : les valeurs des paramètres sont empilées. La procédure lit la pile.
On va écrire une procédure (SOMME) qui calcule la somme de 2 nombres naturels de 16 bits.
Convenons que les entiers sont passés par les registres AX et BX, et que le résultat sera placé dans le
registre AX.
MOV AX, 6
MOV BX, Truc
CALL SOMME
MOV Truc, AX
Cette technique met en œuvre un nouveau registre, BP (Base Pointer), qui permet de lire des valeurs sur
la pile sans les dépiler ni modifier SP. Le registre BP permet un mode d'adressage indirect spécial, de la
forme :
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 53
MOV BP, SP ; BP pointe sur le sommet
MOV AX, [BP] ; lit sans dépiler
PUSH 6
PUSH Truc
CALL SOMME2
La procédure SOMME2 va lire la pile pour obtenir la valeur des paramètres. Pour cela, il faut bien
comprendre quel est le contenu de la pile après le CALL :
empilée par CALL). Chaque élément de la pile occupe deux octets. La procédure SOMME2 s'écrit donc
:
La solution avec passage par la pile parait plus lourde sur cet exemple simple. Cependant, elle est
beaucoup plus souple dans le cas général que le passage par registre. Il est très facile par exemple
d'ajouter deux paramètres supplémentaires sur la pile. Une procédure bien écrite modifie le moins de
registres possible. En général, l'accumulateur est utilisé pour transmettre le résultat et est donc modifié.
Les autres registres utilisés par la procédure seront normalement sauvegardés sur la pile. Voici une autre
version de SOMME2 qui ne modifie pas la valeur contenue par BP avant l'appel :
Noter que les index des arguments (BP+4 et BP+6) sont modifiés car on a ajouté une valeur au sommet
de la pile.
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 54
V-1-3) JMP : (Saut inconditionnel)
Syntaxe :
JMP cible
Si le JMP est de type FAR alors CS et IP sont remplacé par les nouvelles valeurs obtenues à partir de
l'instruction.
JMP transfert, sans condition, la commande à l'emplacement de destination. L'opérande Cible peut
être obtenu à partir de l'instruction elle- même (JMP direct) ou à partir de la mémoire ou à partir d'un
registre indiqué par l'instruction.
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 55
Si PF=1 alors IP = IP + déplacement
L'exécution de l'instruction MOV BX, AX sera faite après l'exécution de la boucle 5 fois.
V-3-2) LOOPE) LOOPZ : (boucle si égale ou si égale à zéro) : Le registre CX est décrémenter de 1
automatiquement
V-3-3 ) LOOPNE ) LOOPNZ : (boucle si égale ou si égale à zéro) : Le registre CX est décrémenter de 1
automatiquement
Exemple :
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 56
Elles permettent de travailler sur des blocs d'octets ou de mots allant jusqu'à
64 Koctet.
Remarque :
VI-1-1 ) REP :
Ces instructions sont utilisées avec les instructions de chaînes de caractères pour assurer la répétition de
l'instruction si on veut appliquer l'instruction sur un ensemble d'informations.
REP décrément automatiquement CX est test est ce qu'il est égal à zéro ou non. Si CX = 0 REP s'arrêt
Pour REPE/REPZ : c'est la même chose que REP c'est-à-dire elle décrément automatiquement le registre
CX mais elle peut sortir de la boucle si ZF<>0
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 57
Pour REPNE/REPNZ : c'est la même chose que REP c'est-à-dire elle décrément automatiquement le
registre CX mais elle peut sortir de la boucle si ZF=0
Remarque :
Si l'élément à transférer est un octet on utilise : MOVB Si l'élément à transférer est un Mot on utilise :
MOVW
SI et DI sont ensuite incrémentés de 1 (si DF=0) ou décrémentés de 1 (si DF=1) d'une manière
automatique.
Exemple :
Donnee SEGMENT
Mess_Sour db ‘bonjour iset de nabeul' ; message source
Donnee ENDS
Extra SEGMENT
Mes_Des db 22 dup (0) ; message destination
Extra ENDS
Code SEGMENT
Assume CS : Code, DS : Donnee, ES : extra
PROG PROC
MOV AX,Donnee MOV DS, AX MOV AX,Extra MOV ES, AX
LEA SI, Mess_Sour ; pointé le message source
LEA DI, Mess_Des ; pointé le message destination
MOV CX, 22 ; nombre de caractère à transfèrer
CLD ; incrémentation automatique du SI et DI
REP MOVSB ; transfert avec le préfixe REP MOV AX, 4C00H
; Retour au DOS
INT 21H
PROG ENDP
CODE ENDS
END PROG
Comparaison de chaîne : elle soustrait l'octet ou mot de destination (pointé par DI) de l'octet ou
mot source (pointé par SI).CMPS affecte les indicateurs mais ne change pas les opérandes.
Si CMPS est utilisé avec le préfixe de répétition REPE/REPZ, elle est interprétée comme « comparer
tant que la chaîne n'est pas finie (CX <>0) et que les éléments à comparer ne sont pas égaux (ZF=1)
Si CMPS est utilisé avec le préfixe de répétition REPNE/REPNZ, elle est interprétée comme « comparer
tant que la chaîne n'est pas finie (CX <>0) et que les éléments à comparer ne sont pas égaux (ZF=0)
Remarque :
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 58
On ne peut pas utilisé le préfixe REP avec l'instruction CMPS car cela revient à comparer uniquement
les deux derniers éléments des deux chaînes.
Exemple :
Donnee SEGMENT
Mess_1 db ‘bonjour iset de nabeul' Mess_2 db ‘bonsoir iset de nabeul'
Donnee ENDS
Code SEGMENT
Assume CS : Code, DS : Donnee
PROG PROC
MOV AX,Donnee
MOV DS, AX
LEA SI, Mess_Sour ; pointé le message source
LEA DI, Mess_Des ; pointé le message destination
MO V CX, 22 ; nombre de caractère àcomparer
CLD ; incrémentation automatique du SI et DI
REP CMPSB ; transfert avec le préfixe REP JCXZ Tito ; les deux chaînes sont identiques
MOV al, [SI-1] ; on met dans AL le caractère
; Différent
Tito : MOV AX, 4C00H ; Retour au DOS INT 21H
PROG ENDP
CODE ENDS
END PROG
Syntaxe :
SCAS chaine_destination
SCASB
SCASW
SCAS soustrait l'élément de la chaîne de destination (octet ou mot) adressé par DI dans le segment extra
du contenu de AL (un octet) ou de AX (un mot) et agit sur les indicateurs. Ni la chaîne
destination ni l'accumulateur ne change de valeur.
Exemple :
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 59
VI-5 ) Les instructions LOAD STRING (LODS) et STORE STRING (STOS) :
VI-4-1) LODS :
Syntaxe :
LODS chaine_source
LODSB
LODSW
LODS transfert l'élément de chaîne (octet ou mot) adressé par SI au registre AL ou AX et remet à jour
SI pour qu'il pointe vers l'élément suivant de la chaîne.
VI-4-2) STOS :
Syntaxe :
STOS chaine_destination
STOSB
STOSW
STOS transfert un octet ou un mot du registre AL ou AX vers l'élément de chaîne adressé par DI et
modifie DI pour qu'il pointe vers l'emplacement suivant de la chaîne.
Exemple :
transfert d'une chaîne source vers une chaîne destination en utilisant LODS et STOS.
Donnee SEGMENT
Mess_Sour db ‘bonjour iset de nabeul' ; message source
Donnee ENDS
Extra SEGMENT
Mes_Des db 22 dup (0) ; message destination
Extra ENDS
Code SEGMENT
Assume CS : Code, DS : Donnee, ES : extra
PROG PROC
MOV AX,Donnee
MOV DS, AX
MOV AX,Extra
MOV ES, AX
LEA SI, Mess_Sour ; pointé le message source
LEA DI, Mess_Des ; pointé le message destination
MOV CX, 22 ; nombre de caractère à transfèrer
CLD ; incrémentation automatique du SI et DI
DEBUT : LODSB ; transfert avec le préfixe REP STOSB
LOOP DEBUT
MOV AX, 4C00H ; Retour au DOS INT 21H
PROG ENDP
CODE ENDS
END PROG
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 60
VII-1) Indicateurs :
VII-1-1/ STD :
Met CF à 1 ; les registres d'indexation SI et/ou DI sont alors automatiquement décrémenter par les
instructions de chaîne de caractère.
VII-1-2 ) STI :
VII-2 ) Synchronisation :
VII-2-1) HALT :
Maintient le processeur dans un état d'attente d'un RESET ou d'une interruption externe non
masquable ou masquable (avec IF=1).
VII-2-2) WAIT :
Met le CPU en état d'attente tant que sa ligne de TEST n'est pas active. En effet toutes les cinq périodes
d'horloge le CPU vérifie est ce que cette entrée est active ou non, si elle est active le processus exécute
l'instruction suivante à WAIT.
VII-2-3) ESC :
L'instruction Escape fournit un mécanisme par lequel des coprocesseurs peuvent recevoir leurs
instructions à partir de la suite d'instructions du 8086.
VII-2-4 ) LOCK :
Elle utilise dans les systèmes Multiprocesseur en effet elle permet le verrouillage du bus vis-à-vis des
autres processeurs.
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 61
VII-3 Sans opération :
Le CPU ne fait rien on peut s'en servir pour créer des temporisations.
Exemple :
Chapitre 5
LES INTERRUPTIONS
I ) Introduction :
Un système à base de microprocesseur peut comporter plusieurs périphériques tels que : un Ecran,
une souris, une imprimante, un disque dure, un CNA (convertisseur numérique analogique), un CAN etc
..
Pour dialoguer avec ces périphériques le microprocesseur a trois façons de communiquer avec ces
derniers :
- En questionnant de façon continue le périphérique pour vérifier que des données peuvent être lues
ou écrites (Polling).
- En l'interrompant lorsqu'un périphérique est prêt à lire ou écrire des données (interruption)
- En établissant une communication directe entre deux périphériques (DMA : Direct memory acces).
I-1/ Le polling :
Bien que le polling soit une façon simple d'accéder à un périphérique, le débit des données dans un
périphérique est parfois beaucoup plus lent que la vitesse de fonctionnement d'un processeur, et le
polling peut donc être très inefficace. On lui préfère en général la méthode par interruptions.
I-2) Le DMA :
En cas de transfert de données de grande quantité entre deux périphériques, il peut être plus
efficace de laisser communiquer entre eux les deux périphériques plutôt que de solliciter le
processeur. Ce type de communication avec les entrées/sorties s'appelle gestion de transfert par DMA,
Le processeur indique au contrôleur de DMA quels sont les périphériques qui doivent
communiquer, le nombre et éventuellement l'adresse des données à transférer, puis il initie le
transfert. Le processeur n'est pas sollicité durant le transfert, et une interruption signale au
processeur la fin du transfert.
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 62
I-3) L'interruption :
Ce mode d'échange est principalement basé sur l'initiative du périphérique. Grâce à ce mécanisme
d'interruption, le dispositif périphérique prend l'initiative de l'échange.
Une interruption est un évènement qui provoque l'arrêt du programme en cours et provoque le
branchement du microprocesseur à un sous- programme particulier dit de "traitement de
l'interruption".
Lorsqu’un périphérique reçoit des données pour le processeur, il envoie au processeur un signal
d'interruption. Si celui-ci peut être interrompu ( à condition qu'il ne soit pas en train de communiquer
avec un périphérique de plus haute priorité) , il stoppe la tâche en cours , sauve son état ( ces registres)
en mémoire (la zone pile ) et appelle la routine correspondant au numéro d'interruption .
Le fonctionnement des périphériques se fait en général d'une manière asynchrone, donc plusieurs
interruptions peuvent être déclenchées en même temps, il existe souvent un contrôleur d'interruptions
destiné à gérer les conflits entre interruptions
II-1-1 ) Introduction
Une interruption est signalée au processeur par un signal électrique sur une borne spéciale. Lors de la
réception de ce signal, le processeur (traite) l'interruption dès la fin de l'instruction qu'il était en train
d'exécuter. Le traitement de l'interruption consiste soit :
- à l'ignorer et passer normalement à l'instruction suivante : c'est possible uniquement pour certaines
interruptions, nommées interruptions masquables. Il est en effet parfois nécessaire de pouvoir
ignorer les interruptions pendant un certain temps, pour effectuer des traitements très urgents par
exemple. Lorsque le traitement est terminé, le processeur démasque les interruptions et les prend
alors en compte.
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 63
Ces trois entrées permettent l'arrivée d'une demande (interruption externe) extérieur.
L'ordinateur est relié à plusieurs périphériques, mais nous venons de voir qu'il n'y avait qu'un seul signal
de demande d'interruption, INTR. Le contrôleur d'interruptions est un circuit spécial, extérieur au
processeur, dont le rôle est de distribuer et de mettre en attente les demandes d'interruptions
provenant des différents périphériques.
Le contrôleur est relié aux interfaces gérant les périphériques par les bornes IRQ (InteRrupt reQuest). Il
gère les demandes d'interruption envoyées par les périphériques, de façon à les envoyer une par une au
processeur (via INTR). Il est possible de programmer le contrôleur pour affecter des priorités différentes
à chaque périphérique. Avant d'envoyer l'interruption suivante, le contrôleur attend d'avoir reçu le signal
INTA, indiquant que le processeur a bien traité l'interruption en cours.
Une interruption est dite non masquable signifie qu'elle doit toujours être reconnue par le
microprocesseur dès que le signal électrique a été déclenché.
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 64
Remarque :
Pendant la demande d'une interruption NMI tous les indicateurs sont empilés pour sauvegarder leurs
valeurs en cours, puis l'indicateur IF (indicateur d'autorisation d'interruption : Interruption Flag) est mis
à zéro (ce qui interdit toute arrivée de demande d'interruption sur la ligne INTR. Ensuite l'indicateur TF
est mis à zéro (Trap Flag : indicateur pas à pas), puis le microprocesseur empile les registres CS et IP
dans la pile. Enfin le microprocesseur charge le registre IP avec la valeur à 16 bits qui se trouve à
l'adresse mémoire 00008H dans le vecteur d'interruption (voir figure suivante), et le registre CS sera
ensuite chargé avec la valeur de 16 bits située à l'adresse 0000AH, donc le microprocesseur
maintenant pointe sur le programme d'interruption qu'il va exécuter puis revenir à son programme
principal.
Nommer aussi table d'interruption, il contient toujours les adresses des programmes d'interruptions
aux quels le microprocesseur doit se brancher. Le microprocesseur se branche toujours à l'adresse 4 * n
et 4 * n +1 pour chercher le contenu sur 16 bits du CS Si on demande l'interruption INT n.
1. Un signal INT est émis par un périphérique (ou par l'interface gérant celui- ci).
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 65
2. Le contrôleur d'interruptions reçoit ce signal sur une de ses bornes IRQi. Dès que cela est possible
(suivant les autres interruptions en attente de traitement), le contrôleur envoie un signal sur sa borne
INT.
3. Le microprocesseur prend en compte le signal sur sa borne INTR après avoir achevé l'exécution de
l'instruction en cours (ce qui peut prendre quelques cycles d'horloge). Si l'indicateur IF=0, le signal
est ignoré, sinon, la demande d'interruption est acceptée.
4. Si la demande est acceptée, le microprocesseur met sa sortie INTA au niveau 0 pendant 2 cycles
d'horloge, pour indiquer au contrôleur qu'il prend en compte sa demande.
5. En réponse, le contrôleur d'interruption place le numéro de l'interruption associé à la borne IRQi sur le
bus de données.
6. Le processeur lit le numéro de l'interruption sur le bus de données et l'utilise pour trouver le vecteur
d'interruption. Ensuite, tout se passe comme pour un appel système c'est à dire que le processeur :
(d) cherche dans la table des vecteurs d'interruptions l'adresse du traitant d'interruption, qu'il charge dans
CS:IP.
7. La procédure traitant l'interruption se déroule. Pendant ce temps, les interruptions sont masquées
(IF=0). Si le traitement est long, on peut dans certains cas ré-autoriser les interruptions avec l'instruction
STI.
8. La procédure se termine par l'instruction IRET, qui restaure CS, IP et les indicateurs à partir de la pile,
ce qui permet de reprendre le programme qui avait été interrompu.
Les interruptions logicielles sont semblables aux interruptions matérielles. L'unique différence
réside dans le fait que les interruptions logicielles sont émises par des programmes. Les cinq
premières interruptions sont définies par Intel. Les autres interruptions sont définies par le DOS et le
BIOS. Ces interruptions ont une fonction définie, par exemple la lecture et l'écriture sur le disque,
l'écriture des données à l'écran, etc. Contrairement à l'entrée INTR du microprocesseur, l'interruption
logicielle ne peut être ni invalidé ni masquée.
Fonctions BIOS :
Int 1Ah, Fct 02h Date et heure : Lecture de l'horloge temps réel BIOS (> AT) : Cette fonction permet de
lire l'heure de l'horloge temps réel alimentée par batterie. Comme ce type d'horloge n'existe que sur les
AT, seul ce modèle de PC soutient cette fonction.
Entrée :
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 66
AH = 02h
Sortie :
Remarques :
- Le contenu des registres BX, SI, DI, BP et des registres de segment n'est pas modifié par
cette fonction. Le contenu de tous les autres registres peut avoir été modifié.
Cette fonction permet de sortir des caractères sur le périphérique de sortie standard ou de les lire sur le
périphérique d'entrée standard. Le caractère reçu ou écrit chaque fois n'est pas examiné par le
système d'exploitation. Rien de particulier ne se produit donc lorsqu'un caractère Ctrl-C apparaît.
Comme l'entrée et la sortie standard peuvent être redirigées sur d'autres périphériques ou vers un fichier,
les caractères sortis ne doivent pas nécessairement apparaître sur l'écran ni les caractères lus provenir
obligatoirement du clavier. Toutefois, lorsque l'accès se fait sur un fichier, il est impossible pour le
programme d'appel de détecter si tous les caractères de ce fichier ont déjà été lus ou bien si le support
(disquette, disque dur) sur lequel figure ce fichier est déjà plein. Pour l'entrée d'un caractère, la fonction
n'attend pas qu'un caractère soit prêt mais revient immédiatement au programme d'appel dans tous les
cas.
Entrée :
AH = 06h
DL = 0 - 254 : Sortir ce caractère
DL = 255 : Lire un caractère Sortie :
Pour la sortie de caractères : aucune
Pour l'entrée de caractères :
Flag Zéro =1 : aucun caractère n'est prêt
Flag Zéro =0 : Le caractère entré figure dans le registre AL
Remarques :
Lorsque des codes étendus sont lus, le code 0 est tout d'abord renvoyé dans le registre
AL. La fonction doit être appelée à nouveau pour lire le code étendu lui-même.
- Le caractère de code ASCII 255 ne peut être sorti à l'aide de cette fonction puisqu'il est interprété
comme d'entrée d'un caractère.
- Le contenu des registres AH, BX, CX, DX, SI, DI, BP, CS, DS, SS, ES et du registre de flags n'est pas
modifié par cette fonction.
l'écran :
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 67
CODE SEGMENT ASSSUME CS :CODE PROG PROC
DEBUT :
MOV AH,06H ; préparer l'interruption de lecture d'un
MOV DL,255 ; caractère
INT 21H
JZ DEBUT ; si le bit ZF = 0 => aucune touche n'est appuyée
MOV DL,AL ; afficher le caractère appuyer .
INT 21H
MOV AX,4C00H ; retour au DOS
INT 21H PROG ENDP
CODE ENDS
END PROG
Cette fonction permet de sortir une chaîne de caractères sur le périphérique de sortie
standard. Comme ce périphérique standard peut être redirigé sur un autre périphérique ou vers un
fichier, il n'y a aucune garantie que la chaîne de caractères apparaisse sur l'écran. Si la sortie est
redirigée sur un fichier, le programme d'appel n'a aucune possibilité de détecter si le support (disquette,
disque dur) sur lequel figure le fichier est déjà plein, autrement dit s'il est encore possible d'écrire
la chaîne de caractères dans le fichier.
Entrée :
AH = 09h
Sortie : Aucune
DONNEE SEGEMENT
MESSAGE DB ‘ BONJOUR ISET DE NABEUL $',13,10
DONNEE ENDS
CODE SEGMENT
ASSUME CS : CODE , DS : DONNEE
PROG PROC
MOV AX , DONNEE MOV DS , AX
LEA DX , MESSAGE ; Pointé le message par DX MOV AH , 09H
INT 21H ; afficher le message
MOV AX,4C00H ; Retour au DOS
INT 21H
PROG ENDP CODE ENDS END PROG
Remarques :
La chaîne de caractères doit être stockée dans la mémoire sous forme d'une séquence d'octets
correspondant aux codes ASCII des caractères composant la chaîne. La fin de la chaîne de caractères
doit être signalée au DOS à l'aide d'un caractère "$" (code ASCII 36).
- Si la chaîne de caractères contient des codes de commande comme Backspace, Carriage Return
ou Line Feed, ceux-ci seront traités comme tels.
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 68
- Seul le contenu du registre AL est modifié par l'appel de cette fonction. Exemple de programme
utilisons les interruptions : affichage de l'heure d'un PC :
;********************************************************************************
;********************************************************************************
;****************** Programme affichage de l'heur du PC *************************
;********************************************************************************
;********************************************************************************
code segment assume cs:code
;*********************** programme principal ************************************
prog proc debut: mov ah,02
int 1aH ; interruption qui permet de lire l'heur du PC
mov bl,ch ; ch = heure
call affiche ; afficher les heurs
mov bl,cl ; cl=minute
call affiche ; afficher les minutes
mov bl,dh ; dh=seconde
call affiche ; afficher les secondes
prog endp ; fin de la procédure principale
mov dl,13 ; retour chariot
mov ah,06
int 21h
jmp debut
affiche proc ; procédure d'affichage d'un nombre BCD
mov dl,bl
and dl,0f0h ; masquer pour avoir les dizaines
ror dl,1 ; faire une rotation
ror dl,1
ror dl,1
ror dl,1
add dl,30h ; ajouter 30H pour avoir le code ASCII correct
mov ah,06 ; du chiffre a afficher
int 21h
mov dl,bl
and dl,0fh
add dl,30h
mov ah,06
int 21h
mov dl,':'
mov ah,06
int 21h ret
affiche endp
code ends
end prog
Int 33h, Fct 00h Réinitialisation du driver de souris Initialise le driver de souris et enclenche ainsi le
test de la souris. Entrée :
AX = 0000h
Sortie :
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 69
Remarques :
L'appel de cette fonction agit sur toute une série de paramètres de la souris qui peuvent être
fixés à l'aide des différentes fonctions de la souris :
- Le curseur de la souris est placé au centre de l'écran puis caché. Il apparaîtra désormais en mode
graphique sous forme d'une flèche, alors qu'il sera représenté en mode de texte sous forme d'une case de
texte en inversion vidéo. Le curseur de la souris est systématiquement affiché dans la page 0 de l'écran,
indépendamment du mode. La zone de déplacement sélectionnée est la totalité de l'écran.
Après appel de cette fonction, le curseur de la souris devient visible sur l'écran et suit désormais les
déplacements de la souris sur l'écran.
Entrée :
AX = 0001h
Sortie :
Aucune
Remarques :
L'appel de cette fonction entraîne l'incrémentation d'un compteur interne, en fonction duquel
le curseur de la souris est ou non affiché sur l'écran. Si ce compteur contient la valeur 0, le curseur de la
souris sera affiché sur l'écran, alors que la valeur -1 a pour effet de le faire disparaître de l'écran. Lorsque
la fonction 00h (Reset) est appelée, ce compteur est tout d'abord fixé sur -1, pour prendre ensuite la
valeur 0 lors du premier appel de cette fonction, ce qui se traduit par la réapparition du curseur sur
l'écran.
Int 33h, Fct 03h Lire la position de la souris et l'état des boutons de la souris :
L'appel de cette fonction fournit la position actuelle de la souris et l'état des différents boutons de
la souris.
Entrée :
AX = 0003h
Sortie :
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 70
3-15 Aucune (0)
Remarques :
Si la souris ne possède que deux boutons, les informations fournies sur le bouton central sont
dépourvues de signification
Chapitre 6
Remarque :
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 71
Le schéma bloc du 8255 montre bien qu'il est divisé en deux groupes :
Le registre de données (Data buffer Bus) assure la liaison entre le bus de données extérieur et le
registre de contrôle ainsi que les ports d'entrées/sorties.
La sélection du 8255A se fait par l'intermédiaire de la pine CS (qui est en général fournie par une
logique de décodage qui permet la sélection du 8255A : voir plus loin les exemples d'applications)
Le bus d'adresse du 8255A est formé essentiellement par deux pines (A0et A1) qui permettent de
sélectionner les ports ainsi que le registre de contrôle comme le montre le tableau suivant :
Plus en détail l'adressage des différents ports en entrée sortie se fait selon la table de vérité suivante :
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 72
Le 8255 est connecté avec le système à base de microprocesseur comme le montre la figure
suivante :
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 73
II ) Programmation du 8255A :
On peut programmer le 8255A selon trois modes :
Le format ainsi que le choix des modes se fait à partir du mot de contrôle suivant :
En mode zéro les ports du 8255A peuvent être programmés en entrée ou en sortie : 8 bits pour le port A,
8 bits pour le port B et le port C est formé de deux quartets (un quartet haut et un quartet bas), donc il y a
16 combinaisons possibles:
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 74
Exemple si on veut configurer le port A en sortie, port B en entrée, portc haut entrée et port C bas sortie
le mot de commande est 8AH
Le programme :
Remarque :
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 75
Exemple 1 :
A/ on veut écrire un programme qui permet de faire clignoter les diodes Leds. Jusqu'à l'appui sur SW0
B) On veut écrire un programme qui affiche les chiffres de 0 à 15 sur les 7 segments.
C) On veut écrire un programme qui permet de faire clignoter les diodes paires si on appuie sur SW0 et
les diodes impaires si on appuie sur SW1
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 76
On suppose que les adresses des ports est comme suit :
Port A : 300H
Port B : 302H
Port C : 304H
Donnee SEGMENT
PortA EQU 300H
PortC EQU 304H
Reg_com EQU 306H
Mot_com EQU 81H
Masque_SW0 EQU 01H
Diode_allume EQU 0FH
Diode_eteinte EQU 00H
Donnee ENDS
Code SEGMENT
Assume CS :code , DS :donnee
Prog Proc
MOV AX,donnee ; pointer le data segment
MOV DS,AX
MOV AL,Mot_com ; configurer les ports en sorties
OUT Reg_com,AL
Debut: MOV AL,Diode_allume ; D3D2D1D0 = FH led allumé
OUT PortA,AL
CALL Tempo ; temporisation
MOV AL,Diode_etainte ; D3D2D1D0 = 0H led etainte
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 77
OUT PortA,AL
CALL Tempo ; temporisation
IN AL,PortC ; Lecture du portC
AND AL,01H ; verifier s'il a appui sur SW0
CMP AL,01H
JNZ Debut
MOV AX,4C00H
INT 21H
Prog endp
Tempo: MOV CX,7FFFH ; Effectuer une temporisation
Temp1: PUSh CX ; avec deux boucles imbriqués
MOV CX,7FFFH
Temp2: NOP
NOP
NOP
NOP
LOOP Temp2
POP CX
LOOP Temp1
RET Code
ends
End prog
B ) Programme qui affiche les chiffres de 0 à 15 sur le 7 segment : L'organigramme du programme est
donné par la figure suivante :
Donnee SEGMENT
PortA EQU 300H
PortB EQU 302H
Reg_com EQU 306H
Mot_com EQU 81H
Masque_SW0 EQU 01H
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 78
Diode_allume EQU 0FH
Diode_eteinte EQU 00H
Donnee ENDS
Code SEGMENT
Assume CS :code , DS :donnee
Prog Proc
MOV AX,donnee ; pointer le data segment
MOV DS,AX
MOV AL,Mot_com ; configurer les ports (A :S )
OUT Reg_com,AL
XOR BX,BX
DEBUT: MOV AX,BX
AAA ; séparer les unités et les dizaines
OR AL,AH
OUT portB,al
CALL Tempo ; effectuer une temporisation
INC BX
CMP BX,15 ; voir si BX = 15
JNZ DEBUT
MOV AX,4C00H
INT 21H
Prog endp
Tempo : MOV CX,7FFFH ; Effectuer une temporisation
Temp1: PUSh CX ; avec deux boucles imbriqués
MOV CX,7FFFH
Temp2: NOP NOP NOP NOP
LOOP Temp2
POP CX LOOP Temp1
RET
Code ends
End prog
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 79
Remarque :
Le battement signifie qu'on allume la diode puis on l'éteint une seule fois car dans notre cas il faut
toujours lire les switches car l'utilisateur peut changer l'état des switches à tout moment.
Donnee SEGMENT
PortA EQU 300H
PortC EQU 302H
Reg_com EQU 306H
Mot_com EQU 91H
Masque_SW0 EQU 01H
Diode_allume EQU 0FH
Diode_etainte EQU 00H
Donnee ENDS
Code SEGMENT
Assume CS :code , DS :donnee
Prog Proc
MOV AX,donnee ; pointer le data segment
MOV DS,AX
MOV AL,Mot_com ; configurer les ports en sorties
OUT Reg_com,AL
DEBUT: IN AL,PortC
AND AL,03H
CMP AL,01
JZ Diode_paire ; si SW=1 alors battement paire
CMP AL,02
JZ Diode_impaire ; si SW=1 alors battement impaire
JMP DEBUT
Diode_paire : MOV AL,05H ; Battement des diodes paire
OUT PortA,AL
CALL Tempo ; Temporisation
MOV AL,00H
OUT PortA,AL
CALL Tempo ; Temporisation
JMP DEBUT
Diode_impaire : MOV AL,0AH ; Battement des diodes impaire
OUT PortA,AL
CALL Tempo ; Temporisation
MOV AL,00H
OUT PortA,AL
CALL Tempo ; Temporisation
JMP DEBUT
MOV AX,4C00H
INT 21H
Prog endp
Tempo : MOV CX,7FFFH ; Effectuer une temporisation
Temp1: PUSh CX ; avec deux boucles imbriqués
MOV CX,7FFFH
Temp2: NOP
NOP
NOP
NOP
LOOP Temp2
POP CX
LOOP Temp1
RET
Code ends
End prog
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 80
Exemples 2 :
On suppose que les adresses des ports est donner comme suit :
Port A : 300H
Port B : 302H
Port C : 304H
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 81
Donnee SEGMENT
PortA EQU 300H
Reg_com EQU 306H
Mot_com EQU 91H
Donnee ENDS
Code SEGMENT
Assume CS :code , DS :donnee
Prog Proc
MOV AX,donnee ; pointer le data segment
MOV DS,AX
MOV AL,Mot_com ; configurer les ports en sorties
OUT Reg_com,AL
DEBUT1: XOR AL,AL
DEBUT2:OUT PORTA,AL
CALL Tempo ; Si on augmente la temporisation
INC AL ; on augmente la pente du signal
CMP AL,0FFH ; et bien sur la période T
JNZ DEBUT2
JMP DEBUT1
Prog endp
Tempo : MOV CX,7FFFH ; Effectuer une temporisation
Temp1: PUSh CX ; avec deux boucles imbriqués
MOV CX,7FFFH
Temp2: NOP
NOP
NOP
NOP
LOOP Temp2
POP CX
LOOP Temp1
RET
Code ends
End prog
Exemple 3 :
Pour commander un afficheur LCD 16*2 ( 16 caractères , 2 lignes ) on propose le schéma du montage
suivant :
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 82
Un LCD est formé essentiellement par un bus de donnée de 8 bits et un bus de commande et contrôle
formé par trois pines(E, Rd/Rw, RS) :
E : entrée de validation un front descendant sur cette pine provoque la validation de la donnée ou de la
commande.
RS : elle permet de distinguer les commandes et les données. RS = 0 le bus D0-D7 accepte des
commandes RS = 1 le bus D0-D7 accepte des données
Enfin Rd/Rw : c'est pour donner l'ordre de lecture ou écriture sur LCD. Parmis les commandes on trouve
:
Exemple de programme qui affiche le message ‘bonjour iset n' sur LCD
Avant de commencer le programme il faut déterminer les mots qu'il faut envoyer au portB pour valider
une donnée ou valider une commande d'où le tableau suivant :
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 83
On suppose que les adresses des ports est donner comme suit :
Port A : 300H
Port B : 302H
Port C : 304H
Donnee SEGMENT
Message db ‘bonjour iset n'
PortB EQU 302H
PortC EQU 304H
Reg_com EQU 306H
Mot_com EQU 80H
Donnee ENDS
Code SEGMENT
Assume CS :code , DS :donnee
Prog Proc
MOV AX,donnee ; pointer le data segment
MOV DS,AX
MOV AL,Mot_com ; configurer les ports en sorties
OUT Reg_com,AL
LEA SI,message ; Pointe le message à afficher
MOV CX,14 ; on 14 caractère à afficher
CALL Init_LCD ; initialisation de l'LCD
DEBUT :
MOV AL,[SI] ; programme principal
OUT PortC,AL ; envoie de la donnée
CALL Vali_donnée ; validation de la donnée
INC SI
LOOP DEBUT
Init_LCD : MOV AL,01 ; effacer LCD
OUT PortC,AL
CALL Vali_commande ; Validation de l'effacement
MOV AL,0EH ; effectuer un Home pour LCD
OUT PortC,AL
CALL Vali_commande ; Valide le HOME
MOV AL,06 ; Ecriture vers la droite
OUT PortC,AL
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 84
CALL Vali_commande ; valide le mode d'écriture.
RET
Vali_commande :
MOV AL,04 ; Sous programme validation
OUT PortB,AL ; de la commande
MOV AL,00
OUT PortB,AL
RET
Vali_donnée :
MOV AL,05 ; Sous programme validation
OUT PortB,AL ; de la donnée
MOV AL,01
OUT PortB,AL
RET
MOV AX,4C00H
INT 21H
Prog endp
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 85
Les différentes phases sont les suivantes (en mode avancement par un pas):
Les différentes phases sont les suivantes (en mode avancement par demi pas):
La commande des phases du moteur pas à pas bipolaire a aimant permanent est donnée par le
tableau suivant :
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 86
D'où le programme par exemple qui fait tourner le moteur pas à pas de 90° : On suppose que les
adresses des ports est donner comme suit :
Port A : 300H
Port B : 302H
Port C : 304H
Donnee SEGMENT
Phase db 03H, 06H, 0CH, 09H, 03H, 06H, 0CH, 09H
PortA EQU 300H
Reg_com EQU 306H
Mot_com EQU 80H
Donnee ENDS
Code SEGMENT
Assume CS : code, DS :donnee
Prog Proc
MOV AX,donnee ; pointer le data segment
MOV DS,AX
MOV AL,Mot_com ; configurer les ports en sorties
OUT Reg_com, AL
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 87
MOV CX, 100 ; 100 * 0.9° = 90°
DEBUT1 : LEA SI, phase ; Pointer sur le tableau des phases
DEBUT2 : MOV AL,[SI]
OUT portA, AL ; Envoie des différentes phases
INC SI
CMP SI,7
JNZ DEBUT2
LOOP DEBUT1
MOV AX, 4C00H ; Retour au DOS INT 21H
Prog endp
Code ENDS
END PROG
En mode 1, les ports A et B sont utilisés en entrée ou en sortie gérées par les accès du portC .
Mode 1: en entrée :
En entrée les ports A et B sont configurés en entrée alors que le PC0, PC1 et PC2 assure le handshake
pour B et PC3, PC4 et PC5 pour le A (PC6 et PC7 peuvent être programmés en entrée ou en sortie).
STB : (Strobe input) : Au niveau bas, charge les données dans le verrou d'entrée. IBF : (Input Buffer
Full) : Au niveau haut les données ont été verrouillées :
Remarque :
Le signal INTE est contrôlé par le mot de commande du portC (PC4 pour le Port A et PC2 pour le Port
B)
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 88
Au départ le périphérique charge les données dans les verrous d'entrée du 8255 (STB=0) puis le 8255
répond au périphérique par : chargement fait (IBF=1). Enfin le 8255 peut interrompre le fonctionnement
du microprocesseur pour lui signaler qu'il a des données à prendre (INTR=1)
La figure suivante illustre ce mode de fonctionnement pour les portA et portB avec leur mot de
commande respectif.
Remarque :
On ne trouve plus dans ce cas l'organisation symétrique du portc (c,a,d portc haut et portc bas)
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 89
Mode 1 : en sortie :
OBF : (Output Buffer Full) : Devient égale à 0 quand le microprocesseur a écrit des données
dans le port, et elle revient à 1 sur le front montant de WR et à 0 sur ACK à zéro.
ACK : (Acknowledge Input) : = 0 signifie que les données ont été acquises.
La figure suivante illustre ce mode de fonctionnement pour les portA et portB avec leur mot de
commande respectif.
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 90
Remarque :
Le port A ainsi que le Port B peuvent être mis en entrée ou en sortie individuellement dans le mode 1 :
c'est le mode mixte
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 91
Le mode 2 ne s'applique qu'au port A. il permet de crée un bus bidirectionnel sur le port
A sur 8 bits, 5 bits du portC sont utilisés pour le statut et le contrôle du portA (permette un handshak
similaire au mode 1).
* STB : (Strobe Input : E) : Niveau bas : les données sont chargées dans le verrou.
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 92
* IBF : (Input Buffer Full : E) : Haut : les données ont été chargées.
PC4.
Pour connecter une interface de 8 bits (le 8255A) avec un bus de données de 16 bits (Le 8086) il faut
prendre des précautions en effet on a vu dans le paragraphe « organisation physique de la mémoire »
qu'avec le microprocesseur 8086 si on accède à une adresse paire les données serons transmises sur le
bus de données D0-D7 mais si on accède à une adresse impaire les données seront transmises sur D8-
D15, Or avec la mémoire on veut que le Bank 0 est connecte au signal BHE et le bank1 est lié avec A0 (
pine d'adresse). Dans le cas du 8255 on a le même problème qu'il faut résoudre lorsque on veut
connecter cette interface avec un microprocesseur 8086.on prenons en considération le tableau suivant :
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 93
1er solution : utilisation des adresses paires : c'est-à-dire que les pines A1 et A2 du
microprocesseur seront connecté respectivement au pine A0 et A1 du 8255. Le schéma de la
solution est donné comme suit :
On utilise les adresses paires et impaires mais à ce moment il faut mettre deux buffer bidirectionnels tels
que le 8286 ou encore 74245. Le schéma est donné alors comme suit :
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 94
Chapitre 7
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 95
La liaison entre l'émetteur et le récepteur en mode série peut être :
Simplexe.
Half duplexe
Full duplexe
Remarque :
La vitesse de transmission est mesurée en bps (bits par seconde), mais aussi BAUD (nombre des
changements du signal par Seconde). Il existe 2 types de Communications Série: Synchrone et
Asynchrone :
Un caractère comprend :
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 96
La cadence de transmission est fixée par une horloge dont la période donne le temps de transmission de
1 bit.
Au repos, la ligne de transmission est à l'état 1. Le début de transmission est signalé par l'apparition du
bit de départ qui est dans l'état logique 0 (START). Les bits de donnée sont ensuite transmis
séquentiellement. Un bit de parité est ajouté éventuellement à la suite des bits de donnée pour vérifier la
bonne transmission des données en effet il permet de détecter des erreurs de transmission. La fin de
transmission du caractère est signalée par un ou plusieurs bits d'arrêt à l'état 1 (bits STOP). Le bit de
départ permet au récepteur de détecter l'arrivée d'un caractère et de recaler la phase de l'horloge
de réception afin d'échantillonner correctement les bits suivants (au milieu de chacun des bits). Ainsi,
comme les fréquences d'émission et de réception ne sont pas strictement identiques, il suffit de
garantir une précision de quelques pour-cent pour assurer une réception valide. Les vitesses
normalisées sont : 50, 75, 110, 150, 300, 600, 1200, 2400,4800, 9600, 19200, 38400 bauds.
Avec la communication synchrone les données sont transmissent d'une manière continue. Il est
donc nécessaire d'effectuer la synchronisation des caractères au début du bloc de données. Cette
synchronisation peut être interne ou externe :
Remarque 1 :
Dans tous les cas, une horloge cadence la transmission des bits qui ne sont donc émis qu'à des instants
déterminés.
Remarque 2 :
Il existe deux circuits pour les Communications Série: UART (Universal Asynchrenous Receiver-
Transmitter, (les Ports COM d'IBM PC utilisent l'UART8050/16550 de NS ) et
USART (Universal Synchroneous- Asynchroneous Receiver-Transmitter (Le 8251 de Intel).
Le composant électronique chargé de la gestion des transmissions séries asynchrones dans les PC est
appelé UART (Universal Asynchronous Receiver Transmitter).le circuit qui gère cette communication
est le 8250 de National Semiconductor ou son équivalent le 16550 dont le brochage est comme suit :
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 97
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 98
Ces registres permettent de construire un protocole sommaire (réglages des bits de parités et
de stop, sélection de la vitesse de transmission) :
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 99
III-1-1 ) LCR - Line Control Register (registre de contrôle de la ligne)
ce registre est codé sur 16 bits : Pour pouvoir utiliser ce registre on a deux adresses, qui permettent de
sélectionner facilement une vitesse de transfert de 50 à 9600 bauds (c'est à dire un maximum de
19200 bps), mais il ne faut pas oublier auparavant de forcer le bit DLAB du registre LCR à l'état 1.
Remarque :
La vitesse n'est pas programmée directement dans l'UART - c'est un circuit comparable à une horloge
(baud rate generator) qui se charge de réguler celle-ci.
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 100
EXEMPLE : pour régler l'UART à une vitesse de 9600 bauds, il faudra copier 0x0C vers DLR.
Ils sont au nombre de trois, et permettent de connaître l'état de la ligne ou du modem, et de réinitialiser
celui-ci :
Les valeurs de ce registre correspondent aux broches de l'interface. Les bits 0 à 3 indiquent les variations
depuis la dernière lecture du processeur du registre - ils seront forcés à 1 si il y a eu changement. Toutes
leurs valeurs sont réinitialisées, s'il y a lieu, à un 0 logique dès que le processeur a achevé une lecture du
registre. Les bits 4 à 7 contiennent, quant à eux, l'état actuel de diverses données de la ligne.
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 101
DCTS (Delta Clear To Send) : variation d'état de la broche CTS (préparation d'émission)
DDSR (Delta Data Set Ready) : variation d'état de la broche DSR (données prêtes)
TERI (Trailing Edge of Ring Indicator): entrée RI de l'UART (Ring Indicator). Ce bit passe à 1
si RI passe de ON (0) à OFF (1). Un appel a été détecté depuis la dernière lecture.
DRLSD (Delta Received Line Signal Detector) : variation d'état de l'entrée RLSD de
l'UART. Indique si la liaison avec le modem distant a été établie.
CTS (Clear To Send) : état de la broche CTS.
DSR (Data Set Ready) : état de la broche DSR.
RI (Ring Indicator) : signale un appel sur la ligne.
RLSD (Receive Line Signal Detect) : indique si la liaison avec le modem distant a été établie.
Les bits OUT1, OUT2, RTS et DTR permettent, en forçant leur valeur, de contrôler la valeur barre
des signaux correspondants (DTR et RTS correspondent à des broches de l'interface, OUT1 et OUT2
sont des sorties auxiliaires).
On pourra par le biais de ces registres déclarer quels événements déclencheront une interruption.
Une fois l'interruption détectée dans le programme, on pourra définir sa cause, et y répondre.
Le bit DLAB du registre LCR (registre de contrôle de ligne) doit être forcé à 0 pour pouvoir accéder à ce
registre. Les quatre bits de poids faible (bits 0 à 3) permettent, lorsqu'ils sont forcés à 1, de générer une
interruptions lors de l'apparition de l'événement associé - on pourra retrouver la cause de cette
interruption dans le registre IIR. La liste ci-dessous définit quels événements associés avec les bits de ce
registre :
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 102
Les trois bits IID (Interrupt ID) permettent de connaître la cause de l'interruption, sa priorité, et le
moyen de désactiver l'interruption. Le tableau suivant fournit la liste des combinaisons de ces trois
bits et leur signification :
TSR (Transmission Shift Register = Registre de décalage de l'émetteur). L'UART se chargera alors
de transmettre le caractère bit à bit sur la ligne, et il pourra y insérer, selon les réglages effectués dans
LCR (contrôle de ligne), un bit de parité et un nombre fixé de bits de stop. Il est important de noter ces
quelques remarques :
· Ce registre est à écriture seule (il possède la même adresse que RBR, le registre de réception : un ordre
de lecture à l'adresse de THR renverra donc le contenu de RBR)
· Le bit DLAB du registre LCR (contrôle de la ligne) doit être forcé à 0 pour pouvoir effectuer une
écriture dans ce registre.
· Ce registre est sur 8 bits. On pourra y envoyer de 5 à 8 bits, suivant les réglages du registre de contrôle
de ligne LCR (bits WLS), sachant que ce sera le bit 0 (poids le plus faible) qui sera le premier transmis.
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 103
· il sera judicieux d'effectuer une lecture de LSR (registre d'état de la ligne) - bits 5 et 6 - pour savoir
quand le registre THR devient libre, et quand le caractère présent dans TDR a été transmi totalement sur
la ligne .
Remarque :
· Le registre RBR est à lecture seule. Les registres d'émission THR et de réception RBR possèdent une
adresse commune. Ainsi une écriture sur l'adresse de RBR provoquera un remplissage du registre THR,
et n'aura aucun effet sur le registre de réception.
· Le bit DLAB du registre LCR (contrôle de la ligne) doit être forcé à 0 pour pouvoir effectuer une
lecture dans ce registre.
· Ce registre est sur 8 bits : y seront copiés les 5 à 8 bits de données, sans bits de contrôle. Le bit 0, de
poids le plus faible, est le premier à avoir été reçu.
· il sera judicieux d'effectuer une lecture de LSR (registre d'état de la ligne) - bits 0 à 4 - pour détecter
les éventuelles erreurs de transmission, ou tout simplement pour savoir si un caractère a été reçu-se
reporter à la partie traitant de ce registre.
Exemple de programme qui permet de lire un caractère du port COM1 par polling :
www.technologuepro.com
Prof : Modeste SOSSOU Tel : 97 69 00 79 / 94 51 00 21 104
COM1 EQU 0
COM2 EQU 1
TBE EQU 20H
RDA EQU 01H
DEBUT :MOV DX, COM1
MOV AH, 03H
INT 14H
TEST AH, TBE ; test la valeur de TBE JZ DEBUT
MOV DX, COM1
MOV AH, 01H
MOV AL, 'a' ; Ecriture du caractère
INT 14H
COM1 EQU 0
COM2 EQU 1
TBE EQU 20H
RDA EQU 01H
DEBUT:
MOV DX, COM1
MOV AH, 03H
INT 14H
TEST AH, RDA
JZ DEBUT
MOV DX, COM1
MOV AH, 02H
INT 14H
www.technologuepro.com