SlideShare une entreprise Scribd logo
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
1/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
2/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
; max. 64Ko pour chacun des segments:
; code et données  MIDIUM, COMPACT, …
.STACK 64 ; marque le début de SS, et lui réserve 64Ko
.DATA ; marque le début de DS
DATA 1 DB 52h ; Le DS définit 3 données: DATA1, DATA2 et SUM
DATA 2 DB 29h ; la directive DB montre a l’assembleur que
SUM DB ? ; les allocations mémoire sont des Octets  DW.
.CODE ; marque le début de CS
MAIN PROC FAR ; Point d’entrée du programme; avec PROCedure
; étiquetée MAIN d’option FAR (a voir avec NEAR)
DEBUT: MOV AX, @DATA ; charger l’adresse du segment de données
MOV DS, AX ; assigner une valeur a DS
MOV AL, DATA1 ; 1er opérande
MOV BL, DATA2 ; 2eme opérande
ADD AL, BL ; additionner les deux opérandes
JZ DEBUT
MOV SUM, AL ; stocker le résultat dans la location SUM
MOV AH, 4Ch ; retourne le control au DOS
INT 21h ; ou bien INT 3h
MAIN ENDP ; fin de la procédure MAIN
END MAIN ; point de sortie du programme
IMPORTANT
1.
On ne peut imposer au DOS d’assigner
des espaces mémoire aux CS, DS et SS.
Le DOS gère a sa façon la mémoire
et seul assignera des valeurs aux CS,
DS et SS.
2.
La valeur de DS/SS/CS diffère d’un PC a
l’autre et d’une version du DOS a l’autre.
Contrairement aux CS et SS, la valeur de
DS devrait être initialisée par
le programme:
MOV AX, @DATA ; DATA indique le début de DS
MOV DS, AX ; et non MOV DS, @DATA
3. Ne tentez pas de modifier les valeurs de CS,
DS, SS  le système peut bloquer.
R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs
3/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
3. Lier le programme fichier.obj LINK ou TLINK fichier.exe
4. Exécuter le programme fichier.exe DEBUG Écran
C> TASM A: fichier.asm <Entrée>
… Compilation  rapports, erreurs ….
C> TLINK A: fichier.obj <Entrée>
… Compilation  rapports, erreurs ….
C> DEBUG A: fichier.exe <Entrée>
… Commandes:
-U CS:0 1 <Entrée>
-D 1066:0 F <Entrée>
-G <Entrée>
-D 1066:0 F <Entrée>
-Q
Code Machine
EDITEUR
PROGRAMME
ASSEMBLEUR
PROGRAMME
LINK
fichier.exe
fichier.asm
fichier.obj
autres_fich.obj
fichier.lst (option / l)
(opcodes, adresses, err)
Note
Utile pour debuguer.
MASM  taper fichier.lst ! more
pour le voir. Utiliser la directives:
TITLE (60 caractères ASCII) et
PAGE 60, 132 ( defaut 66, 80).
Avec TASM: (tasm /l)
fichier.map
Note
Pour localiser les segments
de D et C dans la mémoire.
(Avec TASM: tasm /zi)
R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs
4/21
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
INC BX ; Incrémenter BX pour qu’il pointe sur la prochaine donnée
DEC CX ; Décrémenter la boucle du compteur
JNZ ENCORE ; Sauter si le compteur n’est pas zéro
MOV SUM, AL ; charger le résultat dans la location mémoire SUM
MOV AH, 4Ch INT21h ; retourne le control au DOS
MAIN ENDP ; fin de la procédure MAIN
END MAIN ; point de sortie du programme
B
O
U
C
L
E
Section 2.3 : Quelques Exemples de
Programmes
R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs
5/21
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:
C> debug prog2_1.exe
-u cs:0:19
0B75:0000 B8770B MOV AX, 0B77
0B75:0003 8ED8 MOV DS, AX
0B75:0005 B9 0500 MOV CX, 0005
0B75:0008 BB0000 MOV BX, 0000
0B75:000B 0207 ADD AL, [BX]
0B75:000D 43 INC BX
0B75:000E 49 DEC CX
0B75:000F 75FA JNZ 000D
0B75:0011 020500 MOV [0005], AL
0B75:0014 B44C MOV AH, 4C
0B75:0016 CD21 INT 21
-d 0B77:0 f
0B77:0000 25 12 15 1F 2B 00 00 00 00 00 00 00 00 00 00 00 . …..
-g
Program terminated normally
-d 0B77:0 f
0B77:0000 25 12 15 1F 2B 96 00 00 00 00 00 00 00 00 00 00 . …..
-q
C>
NOTES:
1.
ADD AL, [BX] ajoute le contenu
de la location mémoire pointée par BX
au contenu de AL.
2.
INC BX incrémente le pointeur en
ajoutant 1 au registre BX. Ceci force
BX à pointer sur le prochain octet
(prochaine donnée à additioner).
3.
Il y’a d’autres alternatives pour écrire
le même programme. Celui-ci définit
un champ de données et utilise un
pointeur [BX] pour accéder à ses
éléments. Le programme qui suivra est
une autre façon d’écrire, en évitant la
boucle et l’utilisation de pointeur. C’est
quoi son inconvénient?: fatiguant si
beaucoup de données à additionner
 Adressage direct et indirect.
Section 2.3 : Quelques Exemples de Programmes
DS
CS
Notez que l’octet LSB
est stocké en (1er), i.e.
l’adreese basse.
R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs
6/21
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
Section 2.3 : Quelques Exemples de Programmes
R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs
7/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
8/21
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
0B75:0011 47 INC DI
0B75:0012 49 DEC CX
0B75:0013 75FA JNZ 000E
0B75:0015 BE1000 MOV SI, 0010
0B75:0018 BE891C MOV [SI], BX
0B75:001A B44C MOV AH, 4C
0B75:001C CD21 INT 21
-d 0B77:0 f
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 . …..
-g
Program terminated normally
-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>
Section 2.3 : Quelques Exemples de Programmes
Directive ORG = 10
force SUM pour être
stockée dans DS:0010
Notez que l’octet LSB de SUM (D364)
est stocké en (1er), i.e. l’adreese basse.
Little Endian
ADD DI, 2
Notez que pour stocker le résultat, en
mot, de l’addition, le registre SI est
chargé par l’adresse offset assignée à
SUM (0010). Ensuite le contenu de BX
est déplacé vers les locations
pointées par SI, i.e, les locations 0010
et 0011.
Addressage Indirect
MOV SI, OFFSET SUM
MOV [SI], BX
Addressage Direct
MOV SUM, BX
Autre solution
R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs
9/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
10/21
Execution du Programme 3
C> debug prog2_3.exe
-u cs:0:19
0B75:0000 B8770B MOV AX, 0B77
0B75:0003 8ED8 MOV DS, AX
0B75:0005 BF0000 MOV SI, 0015
0B75:0008 BF0000 MOV DI, 0032
0B75:000B B90400 MOV CX, 0006
0B75:000E 031D ADD AL, [SI]
0B75:0010 2E32 ADD [DI], AL
0B75:0012 47 INC SI
0B75:0013 46 INC DI
0B75:0014 49 DEC CX
0B75:0015 75FA JNZ 000E
0B75:0017 B44C MOV AH, 4C
0B75:0019 CD21 INT 21
-g
Program terminated normally
-d 0B77:0 3f
0B77:0000 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 . …..
0B77:0030 xx xx 2E 23 D5 6A 89 11 xx xx xx xx xx xx xx xx . …..
-q
C>
Section 2.3 : Quelques Exemples de Programmes
NOTE IMPORTANTE:
1.
L’une des taches du DOS est de déterminer le
montant total de la RAM installée dans le PC.
Le DOS utilise la portion dont il a besoin pour le
Système d’opération et alloue le reste.
2.
Mais un programme ne peut dicter les adresses
physiques exactes des locations mémoires pour la
pile et autres segments, a partir du moment que la
gestion de la mémoire incombe au de la responsabilité
du seul DOS, qui avec l’aide du programme LINK,
assemble les programmes dans la mémoire du PC.
3.
Il est recommande d’avoir un seul segment de pile
pour éviter la fragmentation de la RAM par le pile.
mais il n’est pas interdit d’avoir plusieurs segments
de code et de données. C’est la responsabilité de LINK
de combiner les différents segments de codes et
données pour créer un seul programme exécutable
avec un seul segment de pile, qui est la pile du système
R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs
11/21
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.
Section 2.4 : Instructions “contrôle de transfert”
R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs
12/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
13/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).
0B75:0008 BB0000 MOV BX, 0000
0B75:000B 0207 ADD AL, [BX]
0B75:000D 43 INC BX
0B75:000E 49 DEC CX
0B75:000F 75FA JNZ 000D
0B75:0011 020500 MOV [0005], AL
Autre exemple: saut en avant
0005 BB 00 00 ENCORE: MOV AL, [BX]+2
0008 3C 61 CMP AL, 61h
000A 72 06 JB PROCHAINE
000C 3C 7A CMP AL, 7Ah
000E 77 02 JA PROCHAINE
0010 24 DF AND AL, 0DFh
0012 88 04 PROCHAINE: MOV [SI], AL
11 + FA = 000Bh
Adresse cible
Adresse prochaine
instruction
Adresse de l’instruction avec label
(vers laquelle le saut s’effectue)
FA est le “Complément à 2” de - 6
 l’adresse cible est – 6 octets de l’IP
de la prochaine instruction (0011h)
1er saut:
000C + 06 = 0012h
2eme saut:
0010 + 02 = 0012h
R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs
14/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
15/21
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 mP 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
0B75:0203 E8FA00 CALL 0300
0B75:0206 B82F14 MOV AX, 142F
….
0B75:0300 53 PUSH BX
0B75:0301 … … …
…….:…… … … … … …
0B75:0209 5B POP BX
0B75:020A C3 RET
Section 2.4 : Instructions “contrôle de transfert”
PUSH : IP = 0206
le IP doit être sauvegardé
Avant l’exécution de la procédure
POP : 0206
le IP doit être restitué
Après l’exécution de la procédure
Début
de la
procédure 02
06
95
12
BX
IP
PILE
FFFFh
FFFEh
FFFDh
FFFCh
.
.
.
R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs
16/21
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
Section 2.4 : Instructions “contrôle de transfert”
R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs
17/21
L’assembleur supporte tout les types de données du mP80x86 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 mP80x86 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  mP8088/86.
DW (Define Word)  permet d’allouer 2 octets mémoire en même temps  mP8088/86 et
mP80286. 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: mP80386 et mP80486  “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
Section 2.5 : Définition de données et leurs types
R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs
18/21
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.
Section 2.5 : Définition de données et leurs types
R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs
19/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
20/21
Section 2.6 : Fichiers “.COM” et “.EXE”
Fichier EXE Fichier COM (mP8080/85)
Taille illimitée Taille Max. = 64K octets
SS est définit Pas de SS
DS est définit DS est définit dans CS
Code et Données définis a
n’importe Adresse Offset
Code et Données définis
commencent a l’offset 0010
Grand fichier (plus de mémoire) Petit fichier (moins de mémoire)
TITLE prog2_4.com: Addition de 2 mots
PAGE 60, 132
CODSG SEGMENT
ORG 100H
ASSUME CS:CODSG, DS:CODSG, ES:CODSG
;--------------------------l ‘aire du code ----------------------------------------------
PROGCODE PROC NEAR
MOV AX, DATA1
ADD AX, DATA2
MOV SUM, AX
MOV AH, 4CH
INT 21H
PROGCODE ENDP
;--------------------------l ‘aire des donnees----------------------------------------
DATA1 DW 2390
DATA1 DW 3456
SUM DW ?
;---------------------------------------------------------------------------------------------
CODSG ENDS
END PROGCODE
TITLE prog2_5.com: Addition de 2 mots
PAGE 60, 132
CODSG SEGMENT
ORG 100H
ASSUME CS:CODSG, DS:CODSG, ES:CODSG
DEBUT: JMP PROGCODE ; surpasse l’aire Don.
;--------------------------l ‘aire des donnees----------------------------------------
DATA1 DW 2390
DATA1 DW 3456
SUM DW ?
;--------------------------l ‘aire du code ----------------------------------------------
PROGCODE MOV AX, DATA1
ADD AX, DATA2
MOV SUM, AX
MOV AH, 4CH
INT 21H
PROGCODE ENDP
;---------------------------------------------------------------------------------------------
CODSG ENDS
END DEBUT
Ce programme tient longtemps pour s’assembler : solution  Prog2_5
C>EXE2BIN A:PROG , A:PROG.com
.exe
Note:
Pour convertir .exe  .com :
Mais le fichier source doit être
écrit sous format COM, I.e. l’une des
2 formes suivantes:
R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs
21/21

Contenu connexe

Similaire à cours_uP_beguenane_2_chapitre_2partie1.ppt

API et Supervision industrielle
API et Supervision industrielle API et Supervision industrielle
API et Supervision industrielle
sarah Benmerzouk
 
Liaison modbus wago_atv_31
Liaison modbus wago_atv_31Liaison modbus wago_atv_31
Liaison modbus wago_atv_31Moha Belkaid
 
Formation gns3
Formation gns3Formation gns3
Formation gns3
Joeongala
 
Guide sap normes de developpement abap
Guide sap normes de developpement abapGuide sap normes de developpement abap
Guide sap normes de developpement abap
MICKAEL QUESNOT
 
eServices-Tp2: bpel
eServices-Tp2: bpeleServices-Tp2: bpel
eServices-Tp2: bpel
Lilia Sfaxi
 
chapitre-2.pptx.pdf
chapitre-2.pptx.pdfchapitre-2.pptx.pdf
chapitre-2.pptx.pdf
RihabBENLAMINE
 
T1 corrections-qcm
T1 corrections-qcmT1 corrections-qcm
T1 corrections-qcminfcom
 
Chap 1 Intro Microcontroleurs et Interruptions.pdf
Chap 1 Intro Microcontroleurs et Interruptions.pdfChap 1 Intro Microcontroleurs et Interruptions.pdf
Chap 1 Intro Microcontroleurs et Interruptions.pdf
DAPcreat
 
Fpga handout
Fpga handoutFpga handout
Fpga handout
assnad
 
2_8_Cours_Plsql.ppt
2_8_Cours_Plsql.ppt2_8_Cours_Plsql.ppt
2_8_Cours_Plsql.ppt
RihabBENLAMINE
 
Java ME by Amdane Samb at BarCamp Goree, December 2010
Java ME by Amdane Samb at BarCamp Goree, December 2010Java ME by Amdane Samb at BarCamp Goree, December 2010
Java ME by Amdane Samb at BarCamp Goree, December 2010Christelle Scharff
 
Documentation serveur acs wibox (dev interne)
Documentation serveur acs wibox (dev interne)Documentation serveur acs wibox (dev interne)
Documentation serveur acs wibox (dev interne)Taha abbad andaloussi
 
Migration integ x3 v6_2
Migration integ x3 v6_2Migration integ x3 v6_2
Migration integ x3 v6_2bobdelamater
 
Cours Systemes embarques.pptx
Cours Systemes embarques.pptxCours Systemes embarques.pptx
Cours Systemes embarques.pptx
SihemNasri3
 
Tps1200+ tech ref_fr
Tps1200+ tech ref_frTps1200+ tech ref_fr
Tps1200+ tech ref_fr
Rachid Abdi
 
Présentation de Node.js
Présentation de Node.jsPrésentation de Node.js
Présentation de Node.js
Mickael Couzinet
 
Fr E Routing Slm V40
Fr E Routing Slm V40Fr E Routing Slm V40
Fr E Routing Slm V40boukna abdou
 

Similaire à cours_uP_beguenane_2_chapitre_2partie1.ppt (20)

API et Supervision industrielle
API et Supervision industrielle API et Supervision industrielle
API et Supervision industrielle
 
Liaison modbus wago_atv_31
Liaison modbus wago_atv_31Liaison modbus wago_atv_31
Liaison modbus wago_atv_31
 
Formation gns3
Formation gns3Formation gns3
Formation gns3
 
Support lt 2008-2009
Support lt 2008-2009Support lt 2008-2009
Support lt 2008-2009
 
Guide sap normes de developpement abap
Guide sap normes de developpement abapGuide sap normes de developpement abap
Guide sap normes de developpement abap
 
eServices-Tp2: bpel
eServices-Tp2: bpeleServices-Tp2: bpel
eServices-Tp2: bpel
 
chapitre-2.pptx.pdf
chapitre-2.pptx.pdfchapitre-2.pptx.pdf
chapitre-2.pptx.pdf
 
T1 corrections-qcm
T1 corrections-qcmT1 corrections-qcm
T1 corrections-qcm
 
Chap 1 Intro Microcontroleurs et Interruptions.pdf
Chap 1 Intro Microcontroleurs et Interruptions.pdfChap 1 Intro Microcontroleurs et Interruptions.pdf
Chap 1 Intro Microcontroleurs et Interruptions.pdf
 
Dvbshop
DvbshopDvbshop
Dvbshop
 
Fpga handout
Fpga handoutFpga handout
Fpga handout
 
Rapport de sujet BTS 1.0
Rapport de sujet BTS 1.0Rapport de sujet BTS 1.0
Rapport de sujet BTS 1.0
 
2_8_Cours_Plsql.ppt
2_8_Cours_Plsql.ppt2_8_Cours_Plsql.ppt
2_8_Cours_Plsql.ppt
 
Java ME by Amdane Samb at BarCamp Goree, December 2010
Java ME by Amdane Samb at BarCamp Goree, December 2010Java ME by Amdane Samb at BarCamp Goree, December 2010
Java ME by Amdane Samb at BarCamp Goree, December 2010
 
Documentation serveur acs wibox (dev interne)
Documentation serveur acs wibox (dev interne)Documentation serveur acs wibox (dev interne)
Documentation serveur acs wibox (dev interne)
 
Migration integ x3 v6_2
Migration integ x3 v6_2Migration integ x3 v6_2
Migration integ x3 v6_2
 
Cours Systemes embarques.pptx
Cours Systemes embarques.pptxCours Systemes embarques.pptx
Cours Systemes embarques.pptx
 
Tps1200+ tech ref_fr
Tps1200+ tech ref_frTps1200+ tech ref_fr
Tps1200+ tech ref_fr
 
Présentation de Node.js
Présentation de Node.jsPrésentation de Node.js
Présentation de Node.js
 
Fr E Routing Slm V40
Fr E Routing Slm V40Fr E Routing Slm V40
Fr E Routing Slm V40
 

cours_uP_beguenane_2_chapitre_2partie1.ppt

  • 1. 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 1/21
  • 2. 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 2/21
  • 3. 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 ; max. 64Ko pour chacun des segments: ; code et données  MIDIUM, COMPACT, … .STACK 64 ; marque le début de SS, et lui réserve 64Ko .DATA ; marque le début de DS DATA 1 DB 52h ; Le DS définit 3 données: DATA1, DATA2 et SUM DATA 2 DB 29h ; la directive DB montre a l’assembleur que SUM DB ? ; les allocations mémoire sont des Octets  DW. .CODE ; marque le début de CS MAIN PROC FAR ; Point d’entrée du programme; avec PROCedure ; étiquetée MAIN d’option FAR (a voir avec NEAR) DEBUT: MOV AX, @DATA ; charger l’adresse du segment de données MOV DS, AX ; assigner une valeur a DS MOV AL, DATA1 ; 1er opérande MOV BL, DATA2 ; 2eme opérande ADD AL, BL ; additionner les deux opérandes JZ DEBUT MOV SUM, AL ; stocker le résultat dans la location SUM MOV AH, 4Ch ; retourne le control au DOS INT 21h ; ou bien INT 3h MAIN ENDP ; fin de la procédure MAIN END MAIN ; point de sortie du programme IMPORTANT 1. On ne peut imposer au DOS d’assigner des espaces mémoire aux CS, DS et SS. Le DOS gère a sa façon la mémoire et seul assignera des valeurs aux CS, DS et SS. 2. La valeur de DS/SS/CS diffère d’un PC a l’autre et d’une version du DOS a l’autre. Contrairement aux CS et SS, la valeur de DS devrait être initialisée par le programme: MOV AX, @DATA ; DATA indique le début de DS MOV DS, AX ; et non MOV DS, @DATA 3. Ne tentez pas de modifier les valeurs de CS, DS, SS  le système peut bloquer. R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs 3/21
  • 4. 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 3. Lier le programme fichier.obj LINK ou TLINK fichier.exe 4. Exécuter le programme fichier.exe DEBUG Écran C> TASM A: fichier.asm <Entrée> … Compilation  rapports, erreurs …. C> TLINK A: fichier.obj <Entrée> … Compilation  rapports, erreurs …. C> DEBUG A: fichier.exe <Entrée> … Commandes: -U CS:0 1 <Entrée> -D 1066:0 F <Entrée> -G <Entrée> -D 1066:0 F <Entrée> -Q Code Machine EDITEUR PROGRAMME ASSEMBLEUR PROGRAMME LINK fichier.exe fichier.asm fichier.obj autres_fich.obj fichier.lst (option / l) (opcodes, adresses, err) Note Utile pour debuguer. MASM  taper fichier.lst ! more pour le voir. Utiliser la directives: TITLE (60 caractères ASCII) et PAGE 60, 132 ( defaut 66, 80). Avec TASM: (tasm /l) fichier.map Note Pour localiser les segments de D et C dans la mémoire. (Avec TASM: tasm /zi) R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs 4/21
  • 5. 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 INC BX ; Incrémenter BX pour qu’il pointe sur la prochaine donnée DEC CX ; Décrémenter la boucle du compteur JNZ ENCORE ; Sauter si le compteur n’est pas zéro MOV SUM, AL ; charger le résultat dans la location mémoire SUM MOV AH, 4Ch INT21h ; retourne le control au DOS MAIN ENDP ; fin de la procédure MAIN END MAIN ; point de sortie du programme B O U C L E Section 2.3 : Quelques Exemples de Programmes R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs 5/21
  • 6. 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: C> debug prog2_1.exe -u cs:0:19 0B75:0000 B8770B MOV AX, 0B77 0B75:0003 8ED8 MOV DS, AX 0B75:0005 B9 0500 MOV CX, 0005 0B75:0008 BB0000 MOV BX, 0000 0B75:000B 0207 ADD AL, [BX] 0B75:000D 43 INC BX 0B75:000E 49 DEC CX 0B75:000F 75FA JNZ 000D 0B75:0011 020500 MOV [0005], AL 0B75:0014 B44C MOV AH, 4C 0B75:0016 CD21 INT 21 -d 0B77:0 f 0B77:0000 25 12 15 1F 2B 00 00 00 00 00 00 00 00 00 00 00 . ….. -g Program terminated normally -d 0B77:0 f 0B77:0000 25 12 15 1F 2B 96 00 00 00 00 00 00 00 00 00 00 . ….. -q C> NOTES: 1. ADD AL, [BX] ajoute le contenu de la location mémoire pointée par BX au contenu de AL. 2. INC BX incrémente le pointeur en ajoutant 1 au registre BX. Ceci force BX à pointer sur le prochain octet (prochaine donnée à additioner). 3. Il y’a d’autres alternatives pour écrire le même programme. Celui-ci définit un champ de données et utilise un pointeur [BX] pour accéder à ses éléments. Le programme qui suivra est une autre façon d’écrire, en évitant la boucle et l’utilisation de pointeur. C’est quoi son inconvénient?: fatiguant si beaucoup de données à additionner  Adressage direct et indirect. Section 2.3 : Quelques Exemples de Programmes DS CS Notez que l’octet LSB est stocké en (1er), i.e. l’adreese basse. R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs 6/21
  • 7. 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 Section 2.3 : Quelques Exemples de Programmes R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs 7/21
  • 8. 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 8/21
  • 9. 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 0B75:0011 47 INC DI 0B75:0012 49 DEC CX 0B75:0013 75FA JNZ 000E 0B75:0015 BE1000 MOV SI, 0010 0B75:0018 BE891C MOV [SI], BX 0B75:001A B44C MOV AH, 4C 0B75:001C CD21 INT 21 -d 0B77:0 f 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 . ….. -g Program terminated normally -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> Section 2.3 : Quelques Exemples de Programmes Directive ORG = 10 force SUM pour être stockée dans DS:0010 Notez que l’octet LSB de SUM (D364) est stocké en (1er), i.e. l’adreese basse. Little Endian ADD DI, 2 Notez que pour stocker le résultat, en mot, de l’addition, le registre SI est chargé par l’adresse offset assignée à SUM (0010). Ensuite le contenu de BX est déplacé vers les locations pointées par SI, i.e, les locations 0010 et 0011. Addressage Indirect MOV SI, OFFSET SUM MOV [SI], BX Addressage Direct MOV SUM, BX Autre solution R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs 9/21
  • 10. 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 10/21
  • 11. Execution du Programme 3 C> debug prog2_3.exe -u cs:0:19 0B75:0000 B8770B MOV AX, 0B77 0B75:0003 8ED8 MOV DS, AX 0B75:0005 BF0000 MOV SI, 0015 0B75:0008 BF0000 MOV DI, 0032 0B75:000B B90400 MOV CX, 0006 0B75:000E 031D ADD AL, [SI] 0B75:0010 2E32 ADD [DI], AL 0B75:0012 47 INC SI 0B75:0013 46 INC DI 0B75:0014 49 DEC CX 0B75:0015 75FA JNZ 000E 0B75:0017 B44C MOV AH, 4C 0B75:0019 CD21 INT 21 -g Program terminated normally -d 0B77:0 3f 0B77:0000 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 . ….. 0B77:0030 xx xx 2E 23 D5 6A 89 11 xx xx xx xx xx xx xx xx . ….. -q C> Section 2.3 : Quelques Exemples de Programmes NOTE IMPORTANTE: 1. L’une des taches du DOS est de déterminer le montant total de la RAM installée dans le PC. Le DOS utilise la portion dont il a besoin pour le Système d’opération et alloue le reste. 2. Mais un programme ne peut dicter les adresses physiques exactes des locations mémoires pour la pile et autres segments, a partir du moment que la gestion de la mémoire incombe au de la responsabilité du seul DOS, qui avec l’aide du programme LINK, assemble les programmes dans la mémoire du PC. 3. Il est recommande d’avoir un seul segment de pile pour éviter la fragmentation de la RAM par le pile. mais il n’est pas interdit d’avoir plusieurs segments de code et de données. C’est la responsabilité de LINK de combiner les différents segments de codes et données pour créer un seul programme exécutable avec un seul segment de pile, qui est la pile du système R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs 11/21
  • 12. 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. Section 2.4 : Instructions “contrôle de transfert” R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs 12/21
  • 13. 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 13/21
  • 14. 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). 0B75:0008 BB0000 MOV BX, 0000 0B75:000B 0207 ADD AL, [BX] 0B75:000D 43 INC BX 0B75:000E 49 DEC CX 0B75:000F 75FA JNZ 000D 0B75:0011 020500 MOV [0005], AL Autre exemple: saut en avant 0005 BB 00 00 ENCORE: MOV AL, [BX]+2 0008 3C 61 CMP AL, 61h 000A 72 06 JB PROCHAINE 000C 3C 7A CMP AL, 7Ah 000E 77 02 JA PROCHAINE 0010 24 DF AND AL, 0DFh 0012 88 04 PROCHAINE: MOV [SI], AL 11 + FA = 000Bh Adresse cible Adresse prochaine instruction Adresse de l’instruction avec label (vers laquelle le saut s’effectue) FA est le “Complément à 2” de - 6  l’adresse cible est – 6 octets de l’IP de la prochaine instruction (0011h) 1er saut: 000C + 06 = 0012h 2eme saut: 0010 + 02 = 0012h R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs 14/21
  • 15. 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 15/21
  • 16. 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 mP 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 0B75:0203 E8FA00 CALL 0300 0B75:0206 B82F14 MOV AX, 142F …. 0B75:0300 53 PUSH BX 0B75:0301 … … … …….:…… … … … … … 0B75:0209 5B POP BX 0B75:020A C3 RET Section 2.4 : Instructions “contrôle de transfert” PUSH : IP = 0206 le IP doit être sauvegardé Avant l’exécution de la procédure POP : 0206 le IP doit être restitué Après l’exécution de la procédure Début de la procédure 02 06 95 12 BX IP PILE FFFFh FFFEh FFFDh FFFCh . . . R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs 16/21
  • 17. 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 Section 2.4 : Instructions “contrôle de transfert” R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs 17/21
  • 18. L’assembleur supporte tout les types de données du mP80x86 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 mP80x86 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  mP8088/86. DW (Define Word)  permet d’allouer 2 octets mémoire en même temps  mP8088/86 et mP80286. 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: mP80386 et mP80486  “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 Section 2.5 : Définition de données et leurs types R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs 18/21
  • 19. 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. Section 2.5 : Définition de données et leurs types R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs 19/21
  • 20. 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 20/21
  • 21. Section 2.6 : Fichiers “.COM” et “.EXE” Fichier EXE Fichier COM (mP8080/85) Taille illimitée Taille Max. = 64K octets SS est définit Pas de SS DS est définit DS est définit dans CS Code et Données définis a n’importe Adresse Offset Code et Données définis commencent a l’offset 0010 Grand fichier (plus de mémoire) Petit fichier (moins de mémoire) TITLE prog2_4.com: Addition de 2 mots PAGE 60, 132 CODSG SEGMENT ORG 100H ASSUME CS:CODSG, DS:CODSG, ES:CODSG ;--------------------------l ‘aire du code ---------------------------------------------- PROGCODE PROC NEAR MOV AX, DATA1 ADD AX, DATA2 MOV SUM, AX MOV AH, 4CH INT 21H PROGCODE ENDP ;--------------------------l ‘aire des donnees---------------------------------------- DATA1 DW 2390 DATA1 DW 3456 SUM DW ? ;--------------------------------------------------------------------------------------------- CODSG ENDS END PROGCODE TITLE prog2_5.com: Addition de 2 mots PAGE 60, 132 CODSG SEGMENT ORG 100H ASSUME CS:CODSG, DS:CODSG, ES:CODSG DEBUT: JMP PROGCODE ; surpasse l’aire Don. ;--------------------------l ‘aire des donnees---------------------------------------- DATA1 DW 2390 DATA1 DW 3456 SUM DW ? ;--------------------------l ‘aire du code ---------------------------------------------- PROGCODE MOV AX, DATA1 ADD AX, DATA2 MOV SUM, AX MOV AH, 4CH INT 21H PROGCODE ENDP ;--------------------------------------------------------------------------------------------- CODSG ENDS END DEBUT Ce programme tient longtemps pour s’assembler : solution  Prog2_5 C>EXE2BIN A:PROG , A:PROG.com .exe Note: Pour convertir .exe  .com : Mais le fichier source doit être écrit sous format COM, I.e. l’une des 2 formes suivantes: R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs 21/21