Académique Documents
Professionnel Documents
Culture Documents
25
Notes de Cours : Calculateurs & Interfaçage Chapitre03
26
Notes de Cours : Calculateurs & Interfaçage Chapitre03
Fonctionnement :
Si ALE = 1, le verrou est transparent (Q = D) ;
Si ALE = 0, mémorisation de la dernière valeur de D sur les sorties Q;
les signaux de lecture (RD) ou d’écriture (WR) ne sont générés par le
microprocesseur que lorsque les données sont présentes sur le bus
A/D.
29
Notes de Cours : Calculateurs & Interfaçage Chapitre03
BHE : Bus High Enable, signal de lecture de l’octet de poids fort du bus de
données. Le 8086 possède un bus d’adresses sur 20 bits, d’où la capacité
d’adressage de 1 Mo ou 512 K.mots de 16 bits (bus de données sur 16 bits).
Le méga-octet adressable est divisé en deux banques de 512 Ko chacune : la
banque inférieure (ou paire) et la banque supérieure (ou impaire).
30
Notes de Cours : Calculateurs & Interfaçage Chapitre03
A0 Octets transférés
Le 8086 ne peut lire une donnée sur 16 bits en une seule fois, uniquement si
l’octet de poids fort de cette donnée est rangé à une adresse impaire et l’octet
de poids faible à une adresse paire (alignement sur les adresses paires), sinon
la lecture de cette donnée doit se faire en deux opérations successives, d’où
une augmentation du temps d’exécution du transfert dû à un mauvais
alignement des données.
Réalisation des deux banques avec plusieurs boîtiers mémoire :
31
Notes de Cours : Calculateurs & Interfaçage Chapitre03
32
Notes de Cours : Calculateurs & Interfaçage Chapitre03
IV. Organisation interne du 8086:
Le 8086 est constitué de deux unités fonctionnant en parallèle :
L’unité d’exécution (EU : Execution Unit) ;
L’unité d’interface de bus (BIU : Bus Interface Unit).
Ces deux unités ont pour rôle :
33
Notes de Cours : Calculateurs & Interfaçage Chapitre03
Le microprocesseur 8086 contient 14 registres répartis en 4 groupes :
a) Registres généraux
Ce sont des registres généraux mais ils peuvent être utilisés pour des
opérations particulières. Les registres généraux participent aux opérations
arithmétiques et logiques ainsi qu'à l'adressage. Ils sont au nombre de 4. Ils
peuvent être également considérés comme 8 registres sur 8 bits. Le 8086 peut
donc effectuer des opérations 8 bits d'une façon compatible avec le 8080.
AX = (AH, AL): Accumulateur
Usage général,
Obligatoire pour la multiplication et la division,
Ne peut pas servir pour l'adressage.
BX = (BH, BL): Base
Usage général,
Adressage, (Par défaut, son offset est relatif au segment DS).
CX = (CH, CL): Comptage et calcul
Usage général,
Utilisé par certaines instructions comme compteur de répétition,
Ne peut pas servir pour l'adressage.
DX = (DH, DL): Data
Usage général,
Dans la multiplication et la division 16 bits, il sert comme extension au
registre AX pour contenir un nombre 32 bits,
Ne peut pas servir pour l'adressage.
b) Registres de pointeurs et d’index :
Ils sont au nombre de 4 de 16 bits chacun. Ils permettent l’adressage d’un
opérande à l’intérieur d’un segment de mémoire de 64 Ko.
SP : (Stack pointer) Pointeur de Pile
Adressage comme registre de base, (Par défaut, son offset est relatif à
SS),
Utilisé pour adresser les données sur la pile et pour usage général.
SI : (Source index) Registre d'index (source)
Adressage comme registre d’index, (Par défaut, son offset est relatif à
DS),
34
Notes de Cours : Calculateurs & Interfaçage Chapitre03
Certaines instruction de déplacement de donnés l'utilise comme index
de l'opérande source. L'opérande destination étant indexé par DI,
Usage général.
DI : (Destination index) Registre d'index (destination)
Adressage comme registre d’index, (par défaut, son offset est relatif à
DS),
Certaines instruction de déplacement de donnés l'utilise comme index
de l'opérande destination, l'opérande destination étant indexé par SI.
c) Registres de commande (pointeur d’instruction IP et registre
d’état « flags »)
Deux registres sur 16 bits chacun :
Pointeur d’instructions IP :
Contient l’adresse de la prochaine instruction à exécuter.
Registre d’état (flags)
Composé de Neuf bits. Six résument les résultats des opérations
arithmétiques ou logiques et les trois restants participent au contrôle du
processeur.
d) Registres de segments :
Ces registrent sont combiné avec les registres d’offset pour former les
adresses. Une case mémoire est repérée par une adresse de la forme RS:RO.
On place le registre segment au début d’une zone mémoire de de 64Ko,
ensuite on fait varier le registre d’offset qui précise l’adresse relative par
rapport à cette position.
CS : Code Segment
Définit le début de la mémoire programme. Les adresses des différentes
instructions du programme sont relatives à CS.
DS : Data Segment
Début de la mémoire de données dans laquelle sont stockées toutes les
données traitées par le programme.
SS : Stack Segment
Début de la pile.
La pile est une zone mémoire gérée d’une façon particulière. Elle est organisée
comme une pile d’assiettes. On pose et on retire les assiettes toujours sur le
haut de la pile. Un seul registre d’adresse suffit donc pour la gérer, c’est le
stack pointer SP. On dit que c’est une pile LIFO (Last IN, First Out).
Empiler une donnée : sauvegarder une donnée sur (le sommet) de la
pile.
Dépiler une donnée : retirer une donnée (du sommet) de la pile.
ES : Extra Segment
Début d'un segment auxiliaire pour données.
36
Notes de Cours : Calculateurs & Interfaçage Chapitre03
L'adresse de la première case mémoire est 00000H et la dernière est de
FFFFFH. Le problème qui se pose est La solution adoptée par Intel a été la
suivante :
Puisque avec 16 bits en peut adresser 216 octets = 65535 octets = 64
ko, La mémoire totale adressable de 1 Mo est fractionnée en plages de
64 ko appelés segments.
On utilise alors deux registres pour adresser une case mémoire:
o Un registre pour adresser le segment qu'on appelle registre
segment,
o Un autre registre pour adresser à l'intérieur du segment qu'on
désignera par registre d'adressage ou offset.
Une adresse se présente toujours sous la forme segment:offset appelée
adresse logique.
Exemple : procédons au découpage de la mémoire en 16 segments qui
ne se chevauche pas :
… …. …. ….
37
Notes de Cours : Calculateurs & Interfaçage Chapitre03
L’adresse d’une case mémoire donnée sous la forme d’une quantité sur 20
bits (5 digits hexa) est appelée adresse physique car elle correspond à la
valeur envoyée réellement sur le bus d’adresses A0 - A19.
La figure 13 nous donne une correspondance entre l’adresse logique et
l’adresse physique.
Ainsi, l’adresse physique se calcule par l’expression :
Segment
2 0 0 0
3 5 0 Offset
2 0 3 5 0 Adresse physique
38
Notes de Cours : Calculateurs & Interfaçage Chapitre03
Les zones réservées aux segments ne sont pas exclusives, elles peuvent se
chevaucher. La seule règle à respecter lors du choix d'un segment est que le
39
Notes de Cours : Calculateurs & Interfaçage Chapitre03
digit de plus faible poids soit nul. Nous pouvons donc commencer un segment
tous les 16 octets.
Après un RESET du microprocesseur les segments prennent les valeurs
suivantes :
IP = 0000H, CS = FFFFH, DS = 0000H, ES = 0000H, SS = 0000H
40
Notes de Cours : Calculateurs & Interfaçage Chapitre04
41
Notes de Cours : Calculateurs & Interfaçage Chapitre04
Exemples :
INC AX : incrémente le registre AX.
42
Notes de Cours : Calculateurs & Interfaçage Chapitre04
MOV AX, BX : charge le contenu du registre BX dans le registre AX.
Exemples :
MOV AX, 243 : charge le registre AX par le nombre décimal 243 ;
ADD AX, 243h : additionne le registre AX avec le nombre hexadécimal 243 ;
MOV AX, 0xA243 : Quand le chiffre de gauche du nombre hexadécimal est
une lettre, on utilise le préfix 0x pour l'hexadécimal ;
MOV AL, 'a' : Charge le registre AL par le code ASCII du caractère 'a' ;
MOV AX, 'a' : Charge le registre AH par 00 et le registre AL par le code ASCII
du caractère 'a' ;
MOV AX,'ab' : Charge AH par le code ASCII du caractère 'a' et AL par le code
ASCII du caractère 'b'.
Exemples :
MOV BL,[1200 H] : Copie l’octet contenu dans la case mémoire se trouvant
dans le Data Segment d’offset 1200H dans le registre BL,
42
Notes de Cours : Calculateurs & Interfaçage Chapitre04
MOV [243],AX : Copie le contenu de AX dans la mémoire d'adresse DS:243,
Exemples:
MOV AX, [BX] ; Charge AX par le contenu de la mémoire d'adresse DS:BX
MOV AX, [BP] ; Charge AX par le contenu de la mémoire d'adresse SS:BP
MOV AX, [SI] ; Charge AX par le contenu de la mémoire d'adresse DS:SI
MOV AX, [DI] ; Charge AX par le contenu de la mémoire d'adresse DS:DI
MOV AX, [ES:BP] ; Charge AX par le contenu de la mémoire d'adresse ES:BP
Exemples :
MOV AL, [BX] : Charge AL par le contenu de la mémoire DS:BX,
MOV AL, [BP] : Charge AL par le contenu de la mémoire SS:BX,
Exemples :
MOV AX, [SI] ; Charge AX par le contenu de la mémoire DS:SI,
MOV AX, [SI+500] ; Charge AX par la mémoire d'adresse DS:SI+500,
MOV AX, [DI-8] ; Charge AX par la mémoire d'adresse DS:DI-8,
MOV AX, [ES:SI+4] ; Charge AX par la mémoire d'adresse ES:SI+4.
Exemples :
MOV AX,[BX+SI] ; AX est chargé par la mémoire d'adresse DS:BX+SI,
MOV AX,[BX+DI+5] ; AX est chargé par la mémoire d'adresse
DS:BX+DI+5,
MOV AX,[BP+SI-8] ; AX est chargé par la mémoire d'adresse SS:BP+SI-8
MOV AX,[BP+DI] ; AX est chargé par la mémoire d'adresse SS:BP+DI.
42
Notes de Cours : Calculateurs & Interfaçage Chapitre04
Si le registre est un registre double (2 octets), l’opération se fera avec deux
cases mémoires
AL
MOV [adresse], AX adresse
AH
42
Notes de Cours : Calculateurs & Interfaçage Chapitre04
L es syn ta xes :
PUSH Op
Cette instruction agit comme suit :
PUSH R16
PUSH word [adr]
Empiler l’opérande Op
Décrémente SP de 2.
Copie Op dans la mémoire pontée par SP.
L’opérande doit être sur 16 bits
POP Op
Cette instruction effectue l’opération inverse de l’instruction POP :
Dépiler dans l’opérande Op,
Copie les deux cases mémoire pointée par SP dans l'opérande Op,
Incrémente SP de 2
POP R16
POP word M
Tout comme l’instruction précédente l’opérande de l’instruction POP
doit être sur 16 bits.
PUSHA
Empile tous les registres généraux et d’adressage dans l'ordre suivant :
AX, CX, DX, BX, SP, BP, SI, DI
POPA
Dépile tous les registres généraux et d’adressage dans l'ordre inverse de
PUSHA afin que chaque registre retrouve sa valeur. La valeur dépilée de SP
est ignorée.
Remarque : Les deux instructions PUSHA et POPA ne sont pas reconnues par
le 8086. Elles ont été introduites à partir du 80186. Nous avons jugé bon de
les introduire dans ce cours car elles sont très utiles et comme nous
travaillons sur des Pentium, on peut les utiliser sans problème.
XCHG OD , OS
Echange l'opérande Source avec l'opérande Destination. Impossible sur
segment.
XCHG R1 , R2
XCHG [adr] , R
XCHG R , [adr]
L’instruction XCHG ne permet pas l’échange des contenues de deux cases
mémoires.
i. Addition :
ADD Od , Os
L’opération effectuée est : Od Od + Os.
Exemples :
ADD ah, [1100H] : ajoute le contenu de la case mémoire d’offset 1100H à
l’accumulateur AH (adressage direct) ;
44
Notes de Cours : Calculateurs & Interfaçage Chapitre04
ADD ah, [bx]: ajoute le contenu de la case mémoire pointée par BX à
l’accumulateur AH (adressage basé) ;
ADD byte ptr [1200H], 05H: ajoute la valeur 05H au contenu de la case
mémoire d’offset 1200H (adressage immédiat).
ADC Od , Os
Additionne l'opérande source, l'opérande destination et le curry avec résultat
dans l'opérande destination : Od Od + Os+ C.
INC Op
Incrémente l’opérande Op : Op Op + 1.
Attention, l’indicateur « C » n’est pas positionné quand il y a débordement,
C'est l’indicateur « Z » qui permet de détecter le débordement.
Pour incrémenter une case mémoire, il faut préciser la taille :
INC byte [ ] ou INC word [ ]
A p p lic a t io n :
En partant à chaque fois de la situation illustrée par la
figure. Quelle est la situation après chacune des instructions
suivantes :
INC byte ptr [4000h]
INC word ptr [4000h]
ii. Soustraction :
SUB Od, Os
Soustrait l'opérande source et l'opérande destination avec le résultat dans
l'opérande destination : Od Od - Ds.
SBB Od, Os
Soustrait l'opérande source et la retenue de l'opérande destination avec le
résultat dans l'opérande destination : Od Od – Ds - C.
DEC Op
Décrémente l’opérande Op : Op Op - 1.
NEG Op
Donne le complément à 2 de l'opérande Op
45
Notes de Cours : Calculateurs & Interfaçage Chapitre04
Remplace Op par son négatif : Op Cà2(Op).
CMP Od, Os
Compare (soustrait) les opérandes Os et Od et positionne les drapeaux en
fonction du résultat. L’opérande Od n’est pas modifié. Elle effectue une
soustraction sur le même principe que la ferait SUB, mais elle ne stocke pas
le résultat. Les drapeaux peuvent ensuite être testés pour effectuer par
exemple des branchements conditionnels.
iii. Multiplication :
MUL Op
C’est une instruction à un seul opérande. Elle effectue une multiplication non
signée entre l'accumulateur (AL ou AX) et l'opérande Op. Le résultat de taille
double est stocké dans l'accumulateur et son extension (AH:AL ou DX:AX).
MUL Op8 : opération effectuée AX AL x Op8.
MUL Op16 : opération effectuée DX:AX AX x Op16.
L'opérande Op ne peut pas être une donnée, c’est soit un registre soit une
position mémoire, dans ce dernier cas, il faut préciser la taille (byte ou word).
La partie haute du produit est AH pour la multiplication 8 bits et DX pour la
multiplication 16 bits.
Les drapeaux C et O sont positionnés si la partie haute du résultat est non
nulle. La partie haute est AH pour la multiplication 8 bits et DX pour la
multiplication 16 bits.
Exemple :
MOV AL,52 MOV AX,4352
MOV BL,31 MOV BX,1631
MUL BL ; AX 52 x 31 MUL BX ; DX:AX 1631 x 4352
Application
Tracer le programme ci-dessous en indiquant à chaque fois la valeur des
indicateurs C et O :
MOV AL,64h
MOV BL,2
MOV BL
MOV AL,64h
MOV CL,3
MOV CL
46
Notes de Cours : Calculateurs & Interfaçage Chapitre04
A éviter :
MUL im MUL AX,R MUL AX, im
IMUL Op (Integer Multiply )
Identique à MUL excepté qu'une multiplication signée est effectuée.
iv. Division :
DIV Op
Effectue la division AX/Op8 ou (DX|AX)/Op16 selon la taille de Op qui doit
être soit un registre soit une mémoire. Dans le dernier cas il faut préciser la
taille de l’opérande.
Résultat : si l’opérande est sur 1 octet, alors AL = quotient et AH = reste ; si
l’opérande est sur 2 octets, alors AX = quotient et DX = reste.
Exemple :
MOV AX,35 MOV DX, 0
MOV BL,10 MOV AX, 1234
DIV BL : AL 3 AH 5 MOV BX, 10
DIV BX : AX 123 DX 4
A éviter :
DIV im DIV AX,R DIV AX, im
Les masques :
Le 8086 ne possède pas d'instructions permettant d'agir sur un seul bit. Les
masques logiques sont des astuces qui permettent d'utiliser les instructions
logiques vues ci-dessus pour agir sur un bit spécifique d'un octet out d'un
WORD.
a- Forcer un bit à 0 :
Pour forcer un bit à 0 sans modifier les autres bits, on utilise l'opérateur
logique AND et ces propriétés :
X AND 0 = 0 (0 = élément absorbant de AND)
X AND 1 = X (1 = élément neutre de AND)
On fait un AND avec une valeur contenant des 0 en face des bits qu'il faut
forcer à 0 et des 1 en face des bits qu'il ne faut pas changer.
42
Notes de Cours : Calculateurs & Interfaçage Chapitre04
XXXXXXXX
AND 1 1 1 0 1 1 0 1
XXX0XX0X
b- Forcer un bit à 1 :
Pour forcer un bit à 1 sans modifier les autres bits, on utilise l'opérateur
logique OR et ces propriétés :
X OR 1 = 1 (1 = élément absorbant de OR)
X OR 0 = X (0 = élément neutre de OR)
On fait un OR avec une valeur contenant des 1 en face des bits qu'il faut
forcer à 1 et des 0 en face des bits qu'il ne faut pas changer.
XXXXXXXX
OR 0 0 1 0 0 0 0 0
XX1XXXXX
c- Inverser un bit :
Pour inverser la valeur d'un bit sans modifier les autres bits, on utilise
l'opérateur logique XOR et ces propriétés :
X XOR 1 = X
X XOR 0 = X (0 = élément neutre de XOR)
Donc, on fait un XOR avec une valeur contenant des 1 en face des bits
qu'il faut inverser et des 0 en face des bits qu'il ne faut pas changer.
XXXXXXXX
OR 0 0 1 0 0 0 0 0
XXXXXXXX
L e b it d e s ig n e e s t c o n s e r v é
SAL Op, n : Décalage arithmétique vers la gauche (Shift Left)
Identique au décalage logique vers la gauche, car il n’y a pas de signe à
préserver.
E x e m p le s :
MOV AL, 11001011B
MOV CL, 5
SAL AL, CL : AL 01100000 B
ROR Op, n : Rotation vers la droite (Rotate Right)
Cette instruction décale l’opérande de n positions vers la droite et réinjecte
par la gauche les bits sortant.
E x e m p le :
MOV AL, 11001011B
MOV CL, 5
ROR AL, 1
ROR AL, CL
R é in je c t io n d u b it s o r t a n t q u i e s t c o p ié d a n s l’in d ic a t e u r d e r e t e n u e C F .
ROL Op, n : Rotation vers la gauche (Rotate Left)
Cette instruction décale l’opérande de n positions vers la droite et réinjecte
par la droite les bits sortant.
E x e m p le :
MOV AL, 11001011B
MOV CL, 5
ROL AL, 1
ROL AL, CL
R é in je c t io n d u b it s o r t a n t q u i e s t c o p ié d a n s l’in d ic a t e u r d e r e t e n u e C F .
44
Notes de Cours : Calculateurs & Interfaçage Chapitre04
RCR Op, n : Rotation vers la droite avec passage par le « CF » (Rotate Right
through carry)
Cette instruction décale l’opérande de n positions vers la droite en passant
par l’indicateur de retenue CF.
E x e m p le :
MOV AL, 11001011B
MOV CL, 5
RCR AL, 1
RCR AL, CL
Le bit sortant par la droite est copié dans l’indicateur de retenue « CF » et la
valeur précédente de CF est réinjectée par la gauche.
RCL Op, n : Rotation vers la gauche avec passage par le « CF » (Rotate Left
through carry)
Cette instruction décale l’opérande de n positions vers la gauche en passant
par l’indicateur de retenue CF.
E x e m p le :
MOV AL, 11001011B
MOV CL, 5
RCL AL, 1
RCL AL, CL
Le bit sortant par la gauche est copié dans l’indicateur de retenue CF et la
valeur précédente de CF est réinjectée par la droite.
A p p lic a t io n (a ):
I n s t r u c t io n s a g is s a n t s u r le s in d ic a t e u r :
45
Notes de Cours : Calculateurs & Interfaçage Chapitre04
SAHF Opération inverse de LAHF : Transfert AH dans l'octet bas du registre
d'état.
PUSHF : Empile le registre d'état,
POPF Dépile le registre d'état,
A p p lic a t io n (b ):
1- Ecrire un programme qui positionne l’indicateur P à 0 sans modifier les
autres indicateurs.
2- Ecrire un programme qui positionne l’indicateur O à 1 sans modifier les
autres indicateurs.
d) Les instructions de contrôle de boucle :
LOOP XYZ : L'instruction LOOP fonctionne automatiquement avec le registre
CX (compteur).
Quant le processeur rencontre une instruction LOOP, il décrémente le
registre CX. Si le résultat n'est pas encore nul, il reboucle à la ligne portant
l'étiquette xyz, sinon il continue le programme à la ligne suivante :
46
Notes de Cours : Calculateurs & Interfaçage Chapitre04
e) Les instructions de branchement :
Les instructions de branchement (ou saut) permettent de modifier l’ordre
d’exécution des instructions du programme en fonction de certaines
conditions. Il existe 3 types de saut :
Saut inconditionnel ;
Sauts conditionnels ;
Appel de sous-programmes.
i. Branchements inconditionnels :
JMP XYZ Provoque un saut sans condition à la ligne portant l'étiquette xyz.
CALL XYZ Appel d'une procédure (sous programme) qui commence à la ligne
XYZ. La position de l'instruction suivant le CALL est empilée pour assurer
une poursuite correcte après l'exécution du sous programme.
RET Retour de sous programme. L'exécution du programme continue à la
position récupérée dans la pile.
INT n appel à l’interruption logicielle n° n
47
Notes de Cours : Calculateurs & Interfaçage Chapitre04
JB XYZ (Jump if Bellow) Branche si inférieur (non signé). C'est-à-dire si C = 1
JBE XYZ (Jump if Bellow or Equal ) aller à la ligne XYZ si inférieur ou égal
(non signé). C'est-à-dire si C + Z = 1
JC XYZ (Jump if CArry ) aller à la ligne XYZ s'il y a retenu. C'est-à-dire si C=1
JNC XYZ (Jump if No CArry) aller à la ligne XYZ s'il n'y a pas de retenu. C'est-
à-dire si C = 0
JG XYZ (Jump if Grater) aller à la ligne XYZ si plus grand (signé). C'est-à-dire
si (S O) + Z = 1
JGE XYZ (Jump if Grater or Equal ) aller à la ligne XYZ si plus grand ou égal
(signé). C'est-à-dire si S O = 0
JL XYZ (Jump if Less) aller à la ligne XYZ si plus petit (signé). C'est-à-dire si
SO=1
JLE XYZ (Jump if Less or Equal) aller à la ligne XYZ si plus petit ou égal
(signé). C'est-à-dire si (S O) + Z = 1
JO XYZ (Jump if Overflow) aller à la ligne XYZ si dépassement. C'est-à-dire si
O=1
JNO XYZ (Jump if No Overflow) aller à la ligne XYZ s'il n'y a pas de
dépassement O = 0
JP/JPE XYZ (Jump if Parity or Parity Even) aller à la ligne XYZ si parité
paire. C'est-à-dire si P = 1
JNP/JPO XYZ (Jump if No Parity or if Parity Odd) aller à la ligne XYZ si parité
impaire. C'est-à-dire si P = 0
JS XYZ (Jump if Sign) aller à la ligne XYZ si signe négatif. C'est-à-dire si S = 1
JNS XYZ (Jump if No Sign) aller à la ligne XYZ si signe positif. C'est-à-dire si
S=0
Application (d):
1- Faire un programme qui réalise la suite d’instructions suivantes :
1. Mettre 1 dan AX
2. incrémenter AX
3. si AX < 200 recommencer au point 2
4. sinon copier AX dans BX
48
Notes de Cours : Calculateurs & Interfaçage Chapitre04
4- - Faire un programme qui multiplie par 3 les 100 octets contenus dans les
100 cases mémoires commençant à l'adresse 4000h. Ne pas utiliser
l'instruction LOOP.
49
Notes de Cours : Calculateurs & Interfaçage Chapitre04
Tab DB 18H, 15H, 13H ; définit un tableau de 3 cases (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.
Name DB ? ; définit une variable 8 bits de valeur initiale quelconque.
DW ( define word) : définit une variable de 16 bits : c-à-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 .
Syntaxe : Nom DW Expression
Exemple :
TT DW 500H ; réserve deux cases mémoire (un mot) a partir de l'adresse TT.
TAB1 DW 10H,11H,14H ; réserve un tableau de 6 cases chaque valeur
sera mise sur deux cases
YY DW ? ; réserve un mot dans la mémoire de valeur initial quelconque.
DD : (Define Double) : réserve un espace mémoire de 32 bits (4 cases mémoire
ou 4 octets) :
Syntaxe : nom DD expression
Exemple :
MOT32 DD 15500000H
Directive DUP
Lorsque l'on veut déclarer un tableau de « n » cases, toutes initialisées à la
même valeur, on utilise la directive DUP:
TAB DB 100 DUP (15) ; 100 octets qui vallent 15
Y DW 10 DUP (?) ; 10 mots de 16 bits non initialisés
Les direcitive Word PTR et Byte PTR :
Dans certains cas, l'adressage indirect est ambigu. Par exemple, si l'on écrit :
MOV [BX], 0 ; range 0 a l'adresse spécifiée par BX
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 :
MOV byte ptr [BX], im ; concerne 1 octet
MOV word ptr [BX], im ; concerne 1 mot de 2 octets
Nom ENDS
Le nom champ étiquette 'Nom' sert a :
- Indiquer le nom du segment.
- Etablir une relation évidente entre des paires d'instructions
Exemple :
Pile SEGMENT STACK ; On met les directives pour réserver de l'espace
;mémoire.
PILE ENDS
Code SEGMENT
ASSUME cs : code, ds, data, es : pile :ss :pile
MOV AX,Data
MOV DS,AX
MOV AX,Extra
MOV ES,AX
MOV AX,pile
MOV SS,AX ; mettre les instructions du programme
Code ENDS
51
Notes de Cours : Calculateurs & Interfaçage Chapitre04
Annexe
A signifie Accumulateur qui peut être AL ou AX selon la taille de l’opération 8
bits ou 16 bits X est l’extension de l’accumulateur :
(8 bits: X =AHX:A = AH:AL = AX) (16 bits: X = DX X:A = DX:AX)
52
Notes de Cours : Calculateurs & Interfaçage Chapitre04
53
Notes de Cours : Calculateurs & Interfaçage Chapitre04
Solutions des applications
Application (a):
54
Notes de Cours : Calculateurs & Interfaçage Chapitre04
2- Faire un programme qui multiplie par 3 les 100 words contenu dans le
segment DATA à partir de l'offset 4000h. On suppose que les résultats
tiennent dans 16 bits (< 65536).
MOV CX,100 ; Chargement de CX par la valeur 100 (compteur)
MOV SI,4000H ; Chargement de l’index SI par le début du tableau
MOV BX,3 ;Chargement de BX par la valeur « 3 »
@bcle: MOV AX,[SI] ; Début de la boucle chargement de AX par la case pointée
par [SI],
MUL BX ; Multiplication de AX par « 3 »,
MOV [SI],AX ; chargement du produit contenu dans AX vers la case du
tableau pointée par SI,
INC SI ; Incrémentation de l’index SI,
INC SI ;Deuxième incrémentation de SI (car les valeurs sont sur
16 bits donc 2xfois 8 bits)
Loop @Bcle ; Fin de la boucle avec un test de CX (si CX=0 fin de
boucle sinon retourne au début de la boucle).
Application (d):
1- Faire un programme qui réalise la suite d’instructions suivantes :
1. Mettre 1 dan AX
2. incrémenter AX
3. si AX < 200 recommencer au point 2
4. sinon copier AX dans BX
MOV AX,1 ;Chargement de AX par la valeur « 1 »,
boucle: INC AX ; Début de la boucle et incrémentation de AX,
CMP AX,200 ; Comparaison de AX avec 200,
JNE boucle ; test et retour vers de le début de la boucle si AX200
sinon on continue le programme,
MOV BX,AX ; chargement de BX par la valeur contenue dans AX.
55
Notes de Cours : Calculateurs & Interfaçage Chapitre04
3- Faire un programme qui cherche la valeur 65 dans le RAM à partir de la
position 4000h. Une fois trouvée, placer son adresse dans le registre AX.
4- Faire un programme qui multiplie par 3 les 100 octets contenus dans les
100 cases mémoires commençant à l'adresse 4000h. Ne pas utiliser
l'instruction LOOP. On suppose que le résultat sera 8 bits.
MOV BX,4000H ; Chargement du registre de base BX par le début du tableau
MOV DL,3 ; Chargement du registre DL par la valeur « 3 »
boucle: MOV AL,[BX] ; Chargement de AL par le contenu de la case mémoire
pointée par BX,
MUL DL ; AX AL x DL,
MOV [BX],AL ; chargement de la case mémoire par le contenue de AL
(mise à jour de la case mémoire par la nouvelle valeur après multiplication),
INC BX ; Incrémentation de BX pour pointer la case suivante,
CMP BX, 4000h+100 ; comparaison du registre de base avec la valeur de
la dernière case mémoire à traiter,
JB boucle ; test si BX<4100 branchement vers l’étiquette boucle sinon
arrêt du programme.
56