Vous êtes sur la page 1sur 21

1/21

Chapitre 2 : Le Langage Assembleur d’Intel 80x86

Section 2.1: Directives

Section 2.2: Éditer, Assembler, Lier et Exécuter un programme

Section 2.3: Quelques exemples

Section 2.4: Instructions “control de transfert”

Section 2.5: Définition de données et leurs types

Section 2.6: Définition du “Segment Complet”

Section 2.7: Fichiers “.COM” et “. EXE”


R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs
2/21

Objectives
Les objectifs de ce chapitre sont:

- Expliquer la différence entre les instructions et pseudo-instructions


dans le langage Assembleur.
- Identifier les segments dans un programme en langage Assembleur.

- Comment Éditer, Assembler, Lier, et Exécuter un programme simple


en langage Assembleur.
- Différencier entre les différentes instructions de contrôle de transfert,
conditionnelles et inconditionnelles comme JMP et CALL.
- Connaître quelques directives de données en langage Assembleur.

- Écrire un programme en langage Assembleur en utilisant la


définition des segments complet et simplifie.

- Expliquer la différence entre les fichier “.COM” et “.EXE” et les


avantages de chacun des deux types.
R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs
3/21

Section 2.1 Directives


Un programme en langage Assembleur = série d’instructions et de directives (pseudo-instructions).
Les directives montrent au logiciel assembleur comment traduire le langage assembleur en code machine.

[ label: ] mnémonique [ opérandes ] [ ;commentaire, génère le code machine pour la CPU ]


[label ] directive [ ;commentaire, ne génère pas de code machine ]
les [ ] indiquent que le champs est optionnel

; Prog2_0.asm : Un exemple montrant la forme d’un programme écrit en langage Assembleur.


.MODEL SMALL ; définit le modèle de mémoire comme petit
IMPORTANT
; max. 64Ko pour chacun des segments: 1.
; code et données  MIDIUM, COMPACT, … On ne peut imposer au DOS d’assigner
.STACK 64 ; marque le début de SS, et lui réserve 64Ko
.DATA ; marque le début de DS
des espaces mémoire aux CS, DS et SS.
DATA 1 DB 52h ; Le DS définit 3 données: DATA1, DATA2 et SUM Le DOS gère a sa façon la mémoire
DATA 2 DB 29h ; la directive DB montre a l’assembleur que et seul assignera des valeurs aux CS,
SUM DB ? ; les allocations mémoire sont des Octets  DW. DS et SS.
.CODE ; marque le début de CS
MAIN PROC FAR ; Point d’entrée du programme; avec PROCedure 2.
; étiquetée MAIN d’option FAR (a voir avec NEAR) La valeur de DS/SS/CS diffère d’un PC a
DEBUT: MOV AX, @DATA ; charger l’adresse du segment de données l’autre et d’une version du DOS a l’autre.
MOV DS, AX ; assigner une valeur a DS
MOV AL, DATA1 ; 1er opérande
Contrairement aux CS et SS, la valeur de
MOV BL, DATA2 ; 2eme opérande DS devrait être initialisée par
ADD AL, BL ; additionner les deux opérandes le programme:
JZ DEBUT MOV AX, @DATA ; DATA indique le début de DS
MOV SUM, AL ; stocker le résultat dans la location SUM MOV DS, AX ; et non MOV DS, @DATA
MOV AH, 4Ch ; retourne le control au DOS
INT 21h ; ou bien INT 3h 3. Ne tentez pas de modifier les valeurs de CS,
MAIN ENDP ; fin de la procédure MAIN
DS, SS  le système peut bloquer.
END MAIN ; point de sortie du programme

R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs


4/21
Section 2.2 Éditer, Assembler, Lier
et Exécuter un programme
Étape Entrée Programme (Logiciel) Sortie
1. Édition du programme Clavier Éditeur (DOS, Word, etc.) fichier.asm
2. Assembler le programme fichier.asm MASM ou TASM fichier.obj Code Machine
3. Lier le programme fichier.obj LINK ou TLINK fichier.exe
4. Exécuter le programme fichier.exe DEBUG Écran

Note
Utile pour debuguer.
EDITEUR C> TASM A: fichier.asm <Entrée>
MASM  taper fichier.lst ! more … Compilation  rapports, erreurs ….
pour le voir. Utiliser la directives:
TITLE (60 caractères ASCII) et fichier.asm
PAGE 60, 132 ( defaut 66, 80).
Avec TASM: (tasm /l) C> TLINK A: fichier.obj <Entrée>
PROGRAMME … Compilation  rapports, erreurs ….
ASSEMBLEUR
fichier.lst (option / l)
(opcodes, adresses, err) autres_fich.obj C> DEBUG A: fichier.exe <Entrée>
… Commandes:
fichier.obj -U CS:0 1 <Entrée>
Note
Pour localiser les segments PROGRAMME -D 1066:0 F <Entrée>
de D et C dans la mémoire.
(Avec TASM: tasm /zi) LINK -G <Entrée>
-D 1066:0 F <Entrée>
fichier.map fichier.exe -Q

R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs


5/21

Section 2.3 : Quelques Exemples de Programmes


La location ou le DOS chargera le programme dépendra de la taille de la RAM et de la version du DOS. Les
valeurs de CS, DS ou l’adresse d’une instruction particulière (comme MOV A, xxxx) peuvent avoir des
valeurs différentes dans les 3 exemples suivants, ne tentez pas de changer les adresses de CS ou DS sinon le
système s’arrêtera.
Programme 1:
PAGE 60, 132
TITLE prog2_1.asm: Addition de 5 octets (25h, 12h, 15h, 1Fh, et 2Bh) et stocker le résultat (sous entendu dans A)
.MODEL SMALL ; définit le modèle de mémoire comme petit
.STACK 64 ; marque le début de SS, et lui réserve 64Ko
;----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- .DATA
; marque le début de DS
DATA_IN DB 25h, 12h, 15h, 1Fh, 2Bh ; Le DS définit 5 données et une donnée résultat
SUM DB ? ; SUM. Les allocations mémoire sont de type DB.
;-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
.CODE ; marque le début de CS
MAIN PROC FAR ; Entrée du progam. avec PROCedure étiquetée MAIN d’option FAR
MOV AX, @DATA ; charger l’adresse du segment de données
MOV DS, AX ; assigner une valeur à DS
MOV CX, 05 ; Initialiser le compteur boucle a la valeur 5
MOV BX, OFFSET DATA_IN ; Assigner au pointeur de données BX l’adresse offset de DATA_IN.
; Note: La directive OFFSET permet d’accéder une adresse offset ; assignée a une variable ou un nom
MOV AL, 0 ; Initialiser AL
ENCORE: ADD AL, [BX] ; Ajouter la prochaine donnée au registre Accum. A
B INC BX ; Incrémenter BX pour qu’il pointe sur la prochaine donnée
O DEC CX ; Décrémenter la boucle du compteur
U
JNZ ENCORE ; Sauter si le compteur n’est pas zéro
C
L MOV SUM, AL ; charger le résultat dans la location mémoire SUM
E MOV AH, 4Ch INT21h ; retourne le control au DOS
MAIN ENDP ; fin de la procédure MAIN
END MAIN ; point de sortie du programme

R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs


6/21

Section 2.3 : Quelques Exemples de Programmes

Après que le programme soit assemblé (tasm prog1_1.asm) et linké (tlink prog1_1.obj), l’exécution
par DEBUG (debug prog1_1.exe) donne, avec les commandes –u, -d, -g et -q:
NOTES:
C> debug prog2_1.exe DS
CS 1.
-u cs:0:19 ADD AL, [BX] ajoute le contenu
0B75:0000 B8770B MOV AX, 0B77 de la location mémoire pointée par BX
0B75:0003 8ED8 MOV DS, AX au contenu de AL.
0B75:0005 B9 0500 MOV CX, 0005 Notez que l’octet LSB
0B75:0008 BB0000 MOV BX, 0000 est stocké en (1er), i.e. 2.
l’adreese basse.
0B75:000D 0207 ADD AL, [BX] INC BX incrémente le pointeur en
0B75:000F 43 INC BX ajoutant 1 au registre BX. Ceci force
0B75:0010 49 DEC CX BX à pointer sur le prochain octet
0B75:0011 75FA JNZ 000D
(prochaine donnée à additioner).
0B75:0013 020500 MOV [0005], AL
0B75:0016 B44C MOV AH, 4C 3.
0B75:0018 CD21 INT 21
Il y’a d’autres alternatives pour écrire
-d 0B77:0 f le même programme. Celui-ci définit
0B77:0000 25 12 15 1F 2B 00 00 00 00 00 00 00 00 00 00 00 . …..
un champ de données et utilise un
-g pointeur [BX] pour accéder à ses
Program terminated normally
éléments. Le programme qui suivra est
-d 0B77:0 f une autre façon d’écrire, en évitant la
0B77:0000 25 12 15 1F 2B 96 00 00 00 00 00 00 00 00 00 00 . ….. boucle et l’utilisation de pointeur. C’est
-q quoi son inconvénient?: fatiguant si
C> beaucoup de données à additionner
 Adressage direct et indirect.
R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs
7/21

Section 2.3 : Quelques Exemples de Programmes

Programme 1b:
PAGE 60, 132
TITLE prog2_1b.asm: Addition de 5 octets (25h, 12h, 15h, 1Fh, et 2Bh) et stocker le résultat (sous entendu dans A)
.MODEL SMALL ; définit le modèle de mémoire comme petit
.STACK 64 ; marque le début de SS, et lui réserve 64Ko
;-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
.DATA ; marque le début de DS
DATA1 DB 25h ; Le DS définit une donnée: DATA1
DATA2 DB 12h ; Le DS définit une donnée: DATA2
DATA3 DB 15h ; Le DS définit une donnée: DATA3
DATA4 DB 1Fh ; Le DS définit une donnée: DATA4
DATA5 DB 2Bh ; Le DS définit une donnée: DATA5
; les allocations mémoire sont de type DB.
SUM DB ? ; Le DS définit une donnée résultat: SUM
;-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
.CODE ; marque le début de CS
MAIN PROC FAR ; Entrée du prog. avec PROCedure étiquetée MAIN d’option FAR
MOV AX, @DATA ; charger l’adresse du segment de données
MOV DS, AX ; assigner une valeur a DS

MOV AL, DATA1 ; Déplacer DATA1 vers AL


ADD AL, DATA2 ; Ajouter la donnée DATA2 au registre Accumulateur A
ADD AL, DATA3 ; Ajouter la donnee DATA3 au registre Accumulateur A
ADD AL, DATA4 ; Ajouter la donnee DATA4 au registre Accumulateur A
ADD AL, DATA5 ; Ajouter la donnee DATA5 au registre Accumulateur A

MOV SUM, AL ; charger le résultat dans la location mémoire SUM


MOV AH, 4Ch INT 21h ; retourne le control au DOS
MAIN ENDP ; fin de la procédure MAIN
END MAIN ; point de sortie du programme

R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs


8/21

Section 2.3 : Quelques Exemples de Programmes

Programme 2:
PAGE 60, 132
TITLE prog2_2.asm: Addition de 4 mots (234Dh, 1DE6h, 3BC7h, et 566Ah) et stocker le résultat (dans A)
.MODEL SMALL ; définit le modèle de mémoire comme petit
.STACK 64 ; marque le début de SS, et lui réserve 64Ko
;-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
.DATA ; marque le début de DS
DATA_IN DW 234Dh, 1DE6h, 3BC7h, 566Ah ; Le DS définit 5 données et une donnée résultat
ORG 10h ; Note: La directive ORG permet d’assigner une adresse offset
; a une variable (nom). Ici SUM sera localisée a partir de 0010h.
SUM DW ? ; SUM. Les allocations mémoire sont de type DW.
;-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
.CODE ; marque le début de CS
MAIN PROC FAR ; Entrée du progam. avec PROCedure étiquetée MAIN d’option FAR
MOV AX, @DATA ; charger l’adresse du segment de données
MOV DS, AX ; assigner une valeur a DS
MOV CX, 04 ; Initialiser le compteur boucle a la valeur 4
MOV DI, OFFSET DATA_IN ; Assigner au pointeur de données DI l’adresse offset de DATA_IN.
MOV BX, 00 ; Initialiser BX
ADD_LP: ADD BX, [DI] ; Ajouter le contenu de la mémoire pointe par DI au registre BX
INC DI ; Incrémenter DI une fois
INC DI ; Incrémenter DI deux fois
DEC CX ; Décrémenter la boucle du compteur
JNZ ADD_LP ; Sauter a l’instruction labelée par ADD_LP si le compteur est nonzero
MOV SI, OFFSET SUM ; charger un pointeur SI pour la variable SUM
MOV [SI], BX ; stocker la donnée dans BX a la location pointée par SI, i.e. SUM
;MOV AH, 4Ch ; retourne le control au DOS
INT 3h ;INT 21h ; retourne le control au DOS
MAIN ENDP ; fin de la procédure MAIN
END MAIN ; point de sortie du programme

R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs


9/21

Section 2.3 : Quelques Exemples de Programmes

Execution du Programme 2

C> debug prog2_2.exe


-u cs:0:19
0B75:0000 B8770B MOV AX, 0B77
0B75:0003 8ED8 MOV DS, AX
0B75:0005 B90400 MOV CX, 0004
0B75:0008 BF0000 MOV DI, 0000
0B75:000B BB0000 MOV BX, 0000
0B75:000E 031D ADD BX, [DI]
0B75:0010 47 INC DI ADD DI, 2
0B75:0011 47 INC DI
0B75:0012 49 DEC CX Addressage Indirect
Notez que pour stocker le résultat, en
0B75:0013 75FA JNZ 000E MOV SI, OFFSET SUM
mot, de l’addition, le registre SI est
0B75:0015 BE1000 MOV SI, 0010 chargé par l’adresse offset assignée à
0B75:0018 BE891C MOV [SI], BX MOV [SI], BX
SUM (0010). Ensuite le contenu de BX
0B75:001A B44C MOV AH, 4C est déplacé vers les locations
0B75:001C CD21 INT 21 pointées par SI, i.e, les locations 0010 Autre solution
-d 0B77:0 f et 0011.
Addressage Direct
0B77:0000 4D 23 E6 1D C7 3B 6A 56 xx xx xx xx xx xx xx xx . …..
0B77:0010 xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx . ….. Directive ORG = 10 MOV SUM, BX
-g force SUM pour être
Program terminated normally stockée dans DS:0010
-d 0B77:0 f
0B77:0000 4D 23 E6 1D C7 3B 6A 56 xx xx xx xx xx xx xx xx . …..
0B77:0010 64 D3 xx xx xx xx xx xx xx xx xx xx xx xx xx xx . …..
-q
C> Notez que l’octet LSB de SUM (D364) Little Endian
est stocké en (1er), i.e. l’adreese basse.

R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs


10/21

Section 2.3 : Quelques Exemples de Programmes

Programme 3:
PAGE 60, 132
TITLE prog3_3.asm: Transfert 6 octets de données des locations avec offset 0010h vers des locations avec offset 0028h
.MODEL SMALL ; définit le modèle de mémoire comme petit
.STACK 64 ; marque le début de SS, et lui réserve 64Ko
;-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
.DATA ; marque le début de DS
ORG 15h
DATA_IN DB 2Eh, 23h, 0D5h, 6Ah, 89h, 11h ; Le DS définit 6 données de type DB  notez que 0D5h et non D5h
ORG 32h
COPIE DB 6 DUP(?) ; pour dupliquer un certain nombre de caracteres: reserver 6 octets

;-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
.CODE ; marque le début de CS
MAIN PROC FAR ; Entrée du progam. avec PROCedure étiquetée MAIN d’option FAR
MOV AX, @DATA ; charger l’adresse du segment de données
MOV DS, AX ; assigner une valeur a DS
MOV SI, OFFSET DATA_IN ; SI pointe sur la donnée a copier.
MOV DI, OFFSET COPIE ; DI pointe sur la COPIE de la données.
MOV CX, 06h ; Compteur de boucle = 06
MOV_LP: MOV AL, [SI] ; Déplacer la prochaine donnée de l’espace DATA_IN vers AL
MOV [DI], AL ; Déplacer la prochaine donnée vers l’espace COPIE
INC SI ; Incrémenter SI
INC DI ; Incrémenter DI
DEC CX ; Décrémenter la boucle du compteur
JNZ MOV_LP ; Sauter a l’instruction MOV_LP si le compteur est nonzero
MOV AH, 4Ch ; retourne le control au DOS
INT 21h ; retourne le control au DOS
MAIN ENDP ; fin de la procédure MAIN
END MAIN ; point de sortie du programme

R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs


11/21

Section 2.3 : Quelques Exemples de Programmes

Execution du Programme 3
NOTE IMPORTANTE:
C> debug prog2_3.exe 1.
-u cs:0:19 L’une des taches du DOS est de déterminer le
0B75:0000 B8770B MOV AX, 0B77
montant total de la RAM installée dans le PC.
0B75:0003 8ED8 MOV DS, AX Le DOS utilise la portion dont il a besoin pour le
0B75:0005 BF0000 MOV SI, 0015 Système d’opération et alloue le reste.
0B75:0008 BF0000 MOV DI, 0032
0B75:000B B90400 MOV CX, 0006 2.
0B75:000E 031D ADD AL, [SI] Mais un programme ne peut dicter les adresses
0B75:0010 031D ADD [DI], AL
0B75:0012 47 INC SI
physiques exactes des locations mémoires pour la
0B75:0013 47 INC DI pile et autres segments, a partir du moment que la
0B75:0014 49 DEC CX gestion de la mémoire incombe au de la responsabilité
0B75:0015 75FA JNZ 000E
du seul DOS, qui avec l’aide du programme LINK,
0B75:0017 B44C MOV AH, 4C
0B75:0019 CD21 INT 21 assemble les programmes dans la mémoire du PC.
-g
3.
Program terminated normally Il est recommande d’avoir un seul segment de pile
-d 0B77:0 3f
pour éviter la fragmentation de la RAM par le pile.
0B77:0000 mais il n’est pas interdit d’avoir plusieurs segments
xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx . …..
0B77:0010 xx xx xx xx xx 2E 23 D5 6A 89 11 xx xx xx xx xx . de
…..code et de données. C’est la responsabilité de LINK
0B77:0030 xx xx 2E 23 D5 6A 89 11 xx xx xx xx xx xx xx xx . …..
de combiner les différents segments de codes et
-q données pour créer un seul programme exécutable
C>
avec un seul segment de pile, qui est la pile du système.
R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs
12/21

Section 2.4 : Instructions “contrôle de transfert”

Dans la séquence des instructions à exécuter, il est souvent nécessaire de transférer le


contrôle du programme vers différentes locations dans la mémoire.

Intra-segment et Inter-segment: NEAR et FAR

Si le contrôle est transféré dans une location à l’intérieur du code segment courant, il est de
type NEAR (Intrasegment). Par contre, s’il se fait à l’extérieur, il est de type FAR (Inter-
segment).
Dans le premier cas seul le registre IP de l’adresse logique CS:IP est à mettre à jour, alors que
les deux registres CS et IP sont à changer avec l’option FAR.

Sauts conditionnels

Avec le saut conditionnel, le contrôle est transféré vers une certaine location si une certaine
condition est rencontrée. Le registre Flag est celui qui indique la condition courante.

R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs


13/21

Section 2.4 : Instructions “contrôle de transfert”


Sauts conditionnels “Au dess(o)us réfère à la relation entre 2 valeurs non signées, alors que plus grand/ moins concerne 2 valeurs
signées.
Mnémonique Condition testée “Saut Si …”
JA/JNBE (CF=0) et (ZF=0) Au dessus/non au dessous ni “zéro”
JAE/JNB (CF=0) Au dessus ou égale/non au dessous
JB/JNAE (CF=1) Au dessous/non au dessus ni égale
JBE/JNA (CF or ZF) =0 Au dessous ou égale /non au dessus
JC (CF=1) Carry
JE/JZ (ZF=1) Égale/Zéro
JG/JNLE [ (SF xor OF) or ZF ] = 0 Plus grand/ pas moins ni égale
JGE/JNL (SF xor OF) = 0 Plus grand ou égale/ pas moins
JL/JNGE (SF xor OR) = 1 Moins / pas plus grand ni égale
JLE/JNG [ (SF xor OF) or ZF ] = 1 Moins ou égale / Pas plus grand
JNC (CF=0) Pas carry
JNE/JNZ (ZF=0) Pas égale / pas zéro
JNO (OF=0) Pas dépassement
JNP/JPO (PF=0) Pas parité / parité impaire
JNS (SF=0) Pas signe
JO (OF=1) Dépassement
JP/JPE (PF=1) Parité / parité égale
JS (SF=1) Signe
R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs
14/21

Section 2.4 : Instructions “contrôle de transfert”


Sauts courts

Tout les sauts conditionnels sont des sauts courts, l’adresse de la cible est à l’intérieure de la
bande [–128 : 127] octets autour de IP. Le saut conditionnel est une instruction à 2 octets:
le 1er est l’opcode et le 2eme est une valeur entre 00h et FFh (soit un saut en arrière vers –
128 et un saut en avant vers +127).
Adresse cible
0B75:0008 BB0000 MOV BX, 0000
0B75:000D 0207 ADD AL, [BX] 13 + FA = 000Dh
0B75:000F 43 INC BX
Adresse prochaine Adresse de l’instruction avec label
0B75:0010 49 DEC CX
instruction (vers laquelle le saut s’effectue)
0B75:0011 75FA JNZ 000D
0B75:0013 020500 MOV [0005], AL
FA est le “Complément à 2” de - 6
 l’adresse cible est – 6 octets de l’IP
Autre exemple: saut en avant de la prochaine instruction (0013h)

0005 BB 00 00 ENCORE: MOV AL, [BX]+2


0008 3C 61 CMP AL, 61h
000A 72 06 JB PROCHAINE 1er saut:
000C 3C 7A CMP AL, 7Ah 000C + 06 = 0012h
000E 77 02 JA PROCHAINE
2eme saut:
0010 24 DF AND AL, 0DFh
0012 88 04 PROCHAINE: MOV [SI], AL
0010 + 02 = 0012h

R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs


15/21

Section 2.4 : Instructions “contrôle de transfert”


Sauts inconditionnels

L’instruction “JMP label” permet le transfert de contrôle inconditionnellement vers la location cible
“label”. Ce saut inconditionnel prends différentes formes:
1.
“JMP SHORT label” ou l’adresse de la location cible est dans la bande [-128:+127] octets de la
mémoire relative a la valeur courante de IP: l’opcode est EBh suivi de l’opérande de 1 octet dans
la bande 00h et FFh. L’opérande + IP+  adresse cible, ou l’opérande est en C’2 si la saut est
en arrière, et IP+ est le IP de la prochaine instruction. La directive SHORT permet un saut
efficace en assignant 1 octet pour l’opérande au lieu de 2 octets.
2.
Le format par défaut “JMP label”, dont l’opcode est E9h, est un saut inconditionnel de type NEAR.
L’adresse de la cible est donnée par l’un des modes d’adressage; direct, registre, registre
indirect, ou mémoire indirect:
- Saut Direct est le même que “JMP SHORT label”, seulement l’adresse cible peut etre à
l’intérieur du segment dans une bande plus large: 0000h – FFFFh, soit +32767 a –32768 de lP.
- Saut Registre Indirect : l’adresse cible se trouve dans un registre, comme dans “JMP BX” ou
IP prend la valeur de BX.
- Saut Mémoire Indirect : l’adresse cible est le contenu de 2 locations mémoire, comme dans
“JMP [DI]” ou IP prend les contenus des locations mémoire pointées par DI et DI+1.
3.
“JMP FAR PTR label” est un saut de type FAR, à l’extérieur du code segment courant; où non
seulement le IP qui est à altérer mais aussi le registre CS doit etre changé.

R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs


16/21

Section 2.4 : Instructions “contrôle de transfert”

Instruction de contrôle de transfert: CALL FAR ou NEAR


Elle est utilisée pour appeler une procédure, une tache qui se répète fréquemment. L’adresse cible se
trouve dans le segment CS courant (type NEAR, c’est le défaut), ou a l’extérieur (type FAR), i.e. en
dehors du segment code.
Quand le compilateur rencontre l’instruction CALL, il indique au P de sauvegarder automatiquement
l’adresse de l’instruction après CALL (soit IP pour NEAR ou CS et IP pour FAR) en empilant dans
la pile les valeurs de ces registres (IP ou CS,IP).
Ensuite il commence à FETCHer les instructions de la procédure en question. Après son exécution, le
contrôle est transféré au programme principale, une fois l’instruction RET (FAR ou NEAR) est
rencontrée dans la subroutine. A ce moment la pile est dépiler pour restaurer le IP (et CS pour
FAR).
.
.
0B75:0200 BB1295 MOV BX, 9512 PUSH : IP = 0206 .
0B75:0203 E8FA00 CALL 0300 le IP doit être sauvegardé

0B75:0206 B82F14 MOV AX, 142F


Avant l’exécution de la procédure
FFFCh 12
BX
FFFDh 95
….
Début FFFEh 06 IP
de la
0B75:030053 PUSH BX
procédure
FFFFh 02
0B75:0301 … … …
…….:…… … … … … …
0B75:0209 5B POP BX
POP : 0206
le IP doit être restitué PILE
Après l’exécution de la procédure
0B75:020A C3 RET
R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs
17/21

Section 2.4 : Instructions “contrôle de transfert”


Utilisation de CALL

PAGE 60, 132


TITLE prog_generic.asm: ….
.MODEL SMALL ; définit le modèle de mémoire comme petit
.STACK 64 ; marque le début de SS, et lui réserve 64Ko
;-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
.DATA ; marque le début de DS
DATA_IN DB 2Eh, 23h, 28h, 6Ah, 89h, 11h ;
COPIE DB 6 DUP(?) ;
;-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
.CODE ; marque le début de CS
MAIN PROC FAR ; Point d’entrée du programme pour le DOS
MOV AX, @DATA ; charger l’adresse du segment de données
MOV DS, AX ; assigner une valeur a DS
CALL SUBR_1
CALL SUBR_2
MOV AH, 4Ch ; retourne le control au DOS
INT 21h ; retourne le control au DOS
MAIN ENDP ; fin de la procédure MAIN
;-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SUBR1 PROC

RET
SUBR1 ENDP
;-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
SUBR2 PROC

RET
SUBR2 ENDP
;-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
END MAIN ; point de sortie du programme

R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs


18/21

Section 2.5 : Définition de données et leurs types


L’assembleur supporte tout les types de données du P80x86 moyennant des directives de données qui
définissent leurs types pour leur réserver des espaces mémoire. Voici quelques directives utilisées par
les P80x86 et supportées par les vendeurs de logiciels et hardwares de IBM PCs et compatibles.
ORG (origine)  le début de l’adresse offset
DB (Define Byte)  permet d’allouer des locations mémoire en unités “octet”, la plus petite
allocation permise  P8088/86.
DW (Define Word)  permet d’allouer 2 octets mémoire en même temps  P8088/86 et
P80286. Les données, écrites en décimale ou binaire, sont converties en
Hex suivant la convention “Little Endian”
DD (Define Doubleword)  permet d’allouer 4 octets mémoire: P80386 et P80486  “Little Endian”
DQ (Define Quadword)  permet d’allouer 8 octets mémoire:  Pentium.  “Little Endian”.
0000 19 DATA1 DB 25 ; Décimale
0001 9D DATA2 DB 10011101B ; Binaire
0002 12 DATA3 DB 12H ; Hexadécimale
0010 ORG 0010H ; Adresse offset
0010 37 36 38 31 DATA4 DB ‘7681’ ; Nombres ASCII
0018 ORG 0018H
0018 00 DATA5 DB ? ; Réserver un octet
0020 ORG 0020H
0020 4D 6F 6E 20 6E 6F 4D DATA6 DB ‘Mon nom’ ; Caractères ASCII
0070 ORG 0070H
0070 BA03 0C00 3B00 4948 DATA7 DW 954, 0CH, 00111011B, ‘HI’ ;
0098 ORG 0098H
0098 FDFF0000 023AB500 0C3B0000 DATA8 DD 65533, 23AB5H, 110000111011B ;
00B0 ORG 00B0H
00B0 C223450000000000 4948000000000000 DATA9 DQ 4523C2H, ‘HI’ ;
00C0

R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs


19/21

Section 2.5 : Définition de données et leurs types

DT (Define Ten bytes)  permet d’allouer des locations mémoire pour les nombres BCD
(addition multioctet).
00E0 ORG 00E0H
00E0 29985643798600000000 DATA10 DT 867943569829h ; BCD
00EA 00000000000000000000 DATA11 DT ? ; rien

DUP (Duplicate)  permet de dupliquer un certain nombre de caractères pour éviter de


taper beaucoup.
0030 ORG 0030H
0030 AFAFAF…AF (16 fois) DATA12 DB 0AFh, …, 0AFh ; 16 octets de AF
0050 ORG 0050H
0050 AFAFAF…AF (16 fois) DATA12 DB 16 DUP(0AFh) ; 16 octets de AF

EQU (Equate)  permet de définir une constante sans occuper la mémoire.

Dans le “Code Segment” Dans le “Data Segment”


COUNT EQU 25 COUNT EQU 25
MOV CX, COUNT COUNTER DB COUNT (dans Data Segment)

Notez la différence avec


COUNT DB 25
MOV CX, COUNT  C’est un adressage direct contrairement au précédent (Adressage immédiat)

Avantage de EQU: Si on désire changer une constante, utilisée plusieurs fois dans les segments code et
données, on n’a pas a le faire dans plusieurs places en utilisant la directive EQU.

R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs


20/21

Section 2.6 : Définition du “Segment Complet”


Par opposition au Segment Simplifie  MASM Ver. 5 et plus, TASM Ver. 1 et plus: Exemple Prog2_2
TITLE prog2_2b.asm: Addition de 4 mots (234Dh, 1DE6h, 3BC7h, et 566Ah) et stocker le résultat (dans A)
PAGE 60, 132

STSEG SEGMENT ; marque le début de SS


DB 32 DUP (?) ;
STSEG ENDS ; marque la fin de SS
;---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
DTSEG SEGMENT ; marque le début de DS
DATA_IN DW 234Dh, 1DE6h, 3BC7h, 566Ah ; Le DS définit 5 données et une donnée résultat
ORG 10h ; Note: La directive ORG permet d’assigner une adresse offset
SUM DW ? ; SUM. Les allocations mémoire sont de type DW.
DTSEG ENDS ; marque la fin de DS
;---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CDSEG SEGMENT ; marque le début de CS
MAIN PROC FAR ; Entrée du programme avec PROCedure étiquetée MAIN d’option FAR
ASSUME CS:CDSEG, DS:DTSEG, SS:STSEG ; montre a l’assembleur quel segments définis par SEGMENT sont a utiliser
MOV AX, DTSEG ; charger l’adresse du segment de données, DTSEG est le label pour DS
MOV DS, AX ; DS est le seul que le programme doit initialiser, pas CS/SS (DOS s’en charge)
MOV CX, 04 ; Initialiser le compteur boucle a la valeur 4
MOV DI, OFFSET DATA_IN ; Assigner au pointeur de données DI l’adresse offset de DATA_IN.
MOV BX, 00 ; Initialiser BX
ADD_LP: ADD BX, [DI] ; Ajouter le contenu de la mémoire pointe par DI au registre BX
INC DI ; Incrémenter DI une fois
INC DI ; Incrémenter DI deux fois
DEC CX ; Décrémenter la boucle du compteur
JNZ ADD_LP ; Sauter a l’instruction labelée par ADD_LP si le compteur est nonzero
MOV SI, OFFSET SUM; charger un pointeur SI pour la variable SUM
MOV [SI], BX ; stocker la donnée dans BX a la location pointée par SI, i.e. SUM
MOV AH, 4Ch ; retourne le control au DOS
INT 21h ; retourne le control au DOS
MAIN ENDP ; fin de la procédure MAIN
CDSEG ENDS ; marque la fin de CS
END MAIN ; point de sortie du programme

R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs


21/21

Section 2.6 : Fichiers “.COM” et “.EXE”


Fichier EXE Fichier COM (P8080/85) Note:
Taille illimitée Taille Max. = 64K octets Pour convertir .exe  .com :
SS est définit Pas de SS
.exe
DS est définit DS est définit dans CS C>EXE2BIN A:PROG , A:PROG.com
Code et Données définis a Code et Données définis Mais le fichier source doit être
n’importe Adresse Offset commencent a l’offset 0010 écrit sous format COM, I.e. l’une des
Grand fichier (plus de mémoire) Petit fichier (moins de mémoire) 2 formes suivantes:
TITLE prog2_4.com: Addition de 2 mots TITLE prog2_5.com: Addition de 2 mots
PAGE 60, 132 PAGE 60, 132
CODSG SEGMENT CODSG SEGMENT
ORG 100H ORG 100H
ASSUME CS:CODSG, DS:CODSG, ES:CODSG ASSUME CS:CODSG, DS:CODSG, ES:CODSG
;--------------------------l ‘aire du code ---------------------------------------------- DEBUT: JMP PROGCODE ; surpasse l’aire Don.
PROGCODE PROC NEAR ;--------------------------l ‘aire des donnees----------------------------------------
MOV AX, DATA1 DATA1 DW 2390
ADD AX, DATA2 DATA1 DW 3456
MOV SUM, AX SUM DW ?
MOV AH, 4CH ;--------------------------l ‘aire du code ----------------------------------------------
INT 21H PROGCODE MOV AX, DATA1
PROGCODE ENDP ADD AX, DATA2
;--------------------------l ‘aire des donnees---------------------------------------- MOV SUM, AX
DATA1 DW 2390 MOV AH, 4CH
DATA1 DW 3456 INT 21H
SUM DW ? PROGCODE ENDP
;--------------------------------------------------------------------------------------------- ;---------------------------------------------------------------------------------------------
CODSG ENDS CODSG ENDS
END PROGCODE END DEBUT

Ce programme tient longtemps pour s’assembler : solution  Prog2_5


R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs

Vous aimerez peut-être aussi