Top Banner
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
21

Chapitre 2 : Le Langage Assembleur dIntel 80x86 Section 2.1:Directives Section 2.2: Éditer, Assembler, Lier et Exécuter un programme Section 2.3: Quelques.

Apr 04, 2015

Download

Documents

Valentine Auge
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Chapitre 2 : Le Langage Assembleur dIntel 80x86 Section 2.1:Directives Section 2.2: Éditer, Assembler, Lier et Exécuter un programme Section 2.3: Quelques.

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

Page 2: Chapitre 2 : Le Langage Assembleur dIntel 80x86 Section 2.1:Directives Section 2.2: Éditer, Assembler, Lier et Exécuter un programme Section 2.3: Quelques.

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

Page 3: Chapitre 2 : Le Langage Assembleur dIntel 80x86 Section 2.1:Directives Section 2.2: Éditer, Assembler, Lier et Exécuter un programme Section 2.3: Quelques.

Section 2.1 DirectivesUn 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 DSDATA 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 queSUM DB ? ; les allocations mémoire sont des Octets DW.

.CODE ; marque le début de CSMAIN 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 DSMOV AL, DATA1 ; 1er opérandeMOV BL, DATA2 ; 2eme opérandeADD AL, BL ; additionner les deux opérandesJZ DEBUTMOV SUM, AL ; stocker le résultat dans la location SUMMOV AH, 4Ch ; retourne le control au DOSINT 21h ; ou bien INT 3h

MAIN ENDP ; fin de la procédure MAINEND MAIN ; point de sortie du programme

IMPORTANT

1. On ne peut imposer au DOS d’assignerdes 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

Page 4: Chapitre 2 : Le Langage Assembleur dIntel 80x86 Section 2.1:Directives Section 2.2: Éditer, Assembler, Lier et Exécuter un programme Section 2.3: Quelques.

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

PROGRAMMEASSEMBLEUR

PROGRAMMELINK

fichier.exe

fichier.asm

fichier.obj

autres_fich.objfichier.lst (option / l)(opcodes, adresses, err)

NoteUtile pour debuguer.MASM taper fichier.lst ! morepour le voir. Utiliser la directives:TITLE (60 caractères ASCII) et PAGE 60, 132 ( defaut 66, 80).Avec TASM: (tasm /l)

fichier.map

NotePour localiser les segmentsde D et C dans la mémoire.(Avec TASM: tasm /zi)

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

4/21

Page 5: Chapitre 2 : Le Langage Assembleur dIntel 80x86 Section 2.1:Directives Section 2.2: Éditer, Assembler, Lier et Exécuter un programme Section 2.3: Quelques.

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, 132TITLE 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 DSDATA_IN DB 25h, 12h, 15h, 1Fh, 2Bh ; Le DS définit 5 données et une donnée résultatSUM DB ? ; SUM. Les allocations mémoire sont de type DB. ;-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

.CODE ; marque le début de CSMAIN PROC FAR ; Entrée du progam. avec PROCedure étiquetée MAIN d’option FAR

MOV AX, @DATA ; charger l’adresse du segment de donnéesMOV DS, AX ; assigner une valeur à DSMOV CX, 05 ; Initialiser le compteur boucle a la valeur 5MOV 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 ALENCORE: 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éeDEC CX ; Décrémenter la boucle du compteur JNZ ENCORE ; Sauter si le compteur n’est pas zéroMOV SUM, AL ; charger le résultat dans la location mémoire SUMMOV AH, 4Ch INT21h ; retourne le control au DOS

MAIN ENDP ; fin de la procédure MAINEND MAIN ; point de sortie du programme

BOUCLE

Section 2.3 : Quelques Exemples de Programmes

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

5/21

Page 6: Chapitre 2 : Le Langage Assembleur dIntel 80x86 Section 2.1:Directives Section 2.2: Éditer, Assembler, Lier et Exécuter un programme Section 2.3: Quelques.

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 f0B77:0000 25 12 15 1F 2B 00 00 00 00 00 00 00 00 00 00 00 . …..

-gProgram terminated normally

-d 0B77:0 f

0B77:0000 25 12 15 1F 2B 96 00 00 00 00 00 00 00 00 00 00 . …..

-qC>

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 forceBX à 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 estune autre façon d’écrire, en évitant la boucle et l’utilisation de pointeur. C’estquoi son inconvénient?: fatiguant sibeaucoup de données à additionner Adressage direct et indirect.

Section 2.3 : Quelques Exemples de Programmes

DSCS

Notez que l’octet LSBest stocké en (1er), i.e.l’adreese basse.

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

6/21

Page 7: Chapitre 2 : Le Langage Assembleur dIntel 80x86 Section 2.1:Directives Section 2.2: Éditer, Assembler, Lier et Exécuter un programme Section 2.3: Quelques.

Programme 1b: PAGE 60, 132TITLE 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 DSDATA1 DB 25h ; Le DS définit une donnée: DATA1DATA2 DB 12h ; Le DS définit une donnée: DATA2DATA3 DB 15h ; Le DS définit une donnée: DATA3DATA4 DB 1Fh ; Le DS définit une donnée: DATA4DATA5 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 CSMAIN PROC FAR ; Entrée du prog. avec PROCedure étiquetée MAIN d’option FAR

MOV AX, @DATA ; charger l’adresse du segment de donnéesMOV DS, AX ; assigner une valeur a DS

MOV AL, DATA1 ; Déplacer DATA1 vers ALADD AL, DATA2 ; Ajouter la donnée DATA2 au registre Accumulateur AADD AL, DATA3 ; Ajouter la donnee DATA3 au registre Accumulateur AADD AL, DATA4 ; Ajouter la donnee DATA4 au registre Accumulateur AADD AL, DATA5 ; Ajouter la donnee DATA5 au registre Accumulateur A

MOV SUM, AL ; charger le résultat dans la location mémoire SUMMOV AH, 4Ch INT 21h ; retourne le control au DOS

MAIN ENDP ; fin de la procédure MAINEND MAIN ; point de sortie du programme

Section 2.3 : Quelques Exemples de Programmes

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

7/21

Page 8: Chapitre 2 : Le Langage Assembleur dIntel 80x86 Section 2.1:Directives Section 2.2: Éditer, Assembler, Lier et Exécuter un programme Section 2.3: Quelques.

Section 2.3 : Quelques Exemples de Programmes

Programme 2:

PAGE 60, 132TITLE 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 DSDATA_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 CSMAIN PROC FAR ; Entrée du progam. avec PROCedure étiquetée MAIN d’option FAR

MOV AX, @DATA ; charger l’adresse du segment de donnéesMOV DS, AX ; assigner une valeur a DSMOV CX, 04 ; Initialiser le compteur boucle a la valeur 4MOV 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 BXINC DI ; Incrémenter DI une foisINC DI ; Incrémenter DI deux foisDEC CX ; Décrémenter la boucle du compteur JNZ ADD_LP ; Sauter a l’instruction labelée par ADD_LP si le compteur est

nonzeroMOV SI, OFFSET SUM ; charger un pointeur SI pour la variable SUMMOV [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 DOSINT 3h ;INT 21h ; retourne le control au DOS

MAIN ENDP ; fin de la procédure MAINEND MAIN ; point de sortie du programme

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

8/21

Page 9: Chapitre 2 : Le Langage Assembleur dIntel 80x86 Section 2.1:Directives Section 2.2: Éditer, Assembler, Lier et Exécuter un programme Section 2.3: Quelques.

Execution du Programme 2

C> debug prog2_2.exe

-u cs:0:19

0B75:0000 B8770B MOV AX, 0B770B75:0003 8ED8 MOV DS, AX0B75:0005 B90400 MOV CX, 00040B75:0008 BF0000 MOV DI, 00000B75:000B BB0000 MOV BX, 00000B75:000E 031D ADD BX, [DI]0B75:0010 47 INC DI0B75:0011 47 INC DI0B75:0012 49 DEC CX0B75:0013 75FA JNZ 000E0B75:0015 BE1000 MOV SI, 00100B75:0018 BE891C MOV [SI], BX0B75:001A B44C MOV AH, 4C0B75:001C CD21 INT 21

-d 0B77:0 f0B77: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 . …..-gProgram terminated normally-d 0B77:0 f0B77: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 . …..

-qC>

Section 2.3 : Quelques Exemples de Programmes

Directive ORG = 10force 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

Page 10: Chapitre 2 : Le Langage Assembleur dIntel 80x86 Section 2.1:Directives Section 2.2: Éditer, Assembler, Lier et Exécuter un programme Section 2.3: Quelques.

Section 2.3 : Quelques Exemples de Programmes

Programme 3:

PAGE 60, 132TITLE 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 DSORG 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 32hCOPIE DB 6 DUP(?) ; pour dupliquer un certain nombre de caracteres: reserver 6

octets;-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

.CODE ; marque le début de CSMAIN PROC FAR ; Entrée du progam. avec PROCedure étiquetée MAIN d’option

FAR MOV AX, @DATA ; charger l’adresse du segment de donnéesMOV DS, AX ; assigner une valeur a DSMOV 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 ALMOV [DI], AL ; Déplacer la prochaine donnée vers l’espace COPIEINC SI ; Incrémenter SIINC DI ; Incrémenter DIDEC CX ; Décrémenter la boucle du compteur JNZ MOV_LP ; Sauter a l’instruction MOV_LP si le compteur est nonzeroMOV AH, 4Ch ; retourne le control au DOSINT 21h ; retourne le control au DOS

MAIN ENDP ; fin de la procédure MAINEND MAIN ; point de sortie du programmeR. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs

10/21

Page 11: Chapitre 2 : Le Langage Assembleur dIntel 80x86 Section 2.1:Directives Section 2.2: Éditer, Assembler, Lier et Exécuter un programme Section 2.3: Quelques.

Execution du Programme 3

C> debug prog2_3.exe

-u cs:0:19

0B75:0000 B8770B MOV AX, 0B770B75:0003 8ED8 MOV DS, AX0B75:0005 BF0000 MOV SI, 00150B75:0008 BF0000 MOV DI, 00320B75:000B B90400 MOV CX, 00060B75:000E 031D ADD AL, [SI]0B75:0010 2E32 ADD [DI], AL0B75:0012 47 INC SI0B75:0013 46 INC DI0B75:0014 49 DEC CX0B75:0015 75FA JNZ 000E0B75:0017 B44C MOV AH, 4C0B75:0019 CD21 INT 21

-g

Program terminated normally

-d 0B77:0 3f0B77: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 . …..

-qC>

Section 2.3 : Quelques Exemples de Programmes

NOTE IMPORTANTE:

1.L’une des taches du DOS est de déterminer lemontant 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 adressesphysiques 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 segmentsde code et de données. C’est la responsabilité de LINKde 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

Page 12: Chapitre 2 : Le Langage Assembleur dIntel 80x86 Section 2.1:Directives Section 2.2: Éditer, Assembler, Lier et Exécuter un programme Section 2.3: Quelques.

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

Page 13: Chapitre 2 : Le Langage Assembleur dIntel 80x86 Section 2.1:Directives Section 2.2: Éditer, Assembler, Lier et Exécuter un programme Section 2.3: Quelques.

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) SigneR. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs

13/21

Page 14: Chapitre 2 : Le Langage Assembleur dIntel 80x86 Section 2.1:Directives Section 2.2: Éditer, Assembler, Lier et Exécuter un programme Section 2.3: Quelques.

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, 00000B75:000B 0207 ADD AL, [BX]0B75:000D 43 INC BX0B75:000E 49 DEC CX0B75:000F 75FA JNZ 000D0B75:0011 020500 MOV [0005], AL

Autre exemple: saut en avant

0005 BB 00 00 ENCORE: MOV AL, [BX]+20008 3C 61 CMP AL, 61h000A 72 06 JB PROCHAINE000C 3C 7A CMP AL, 7Ah000E 77 02 JA PROCHAINE0010 24 DF AND AL, 0DFh0012 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

Page 15: Chapitre 2 : Le Langage Assembleur dIntel 80x86 Section 2.1:Directives Section 2.2: Éditer, Assembler, Lier et Exécuter un programme Section 2.3: Quelques.

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

Page 16: Chapitre 2 : Le Langage Assembleur dIntel 80x86 Section 2.1:Directives Section 2.2: Éditer, Assembler, Lier et Exécuter un programme Section 2.3: Quelques.

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

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

12BX

IP

PILE

FFFFh

FFFEh

FFFDh

FFFCh

.

.

.

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

16/21

Page 17: Chapitre 2 : Le Langage Assembleur dIntel 80x86 Section 2.1:Directives Section 2.2: Éditer, Assembler, Lier et Exécuter un programme Section 2.3: Quelques.

Utilisation de CALL

PAGE 60, 132TITLE 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 DSDATA_IN DB 2Eh, 23h, 28h, 6Ah, 89h, 11h ; COPIE DB 6 DUP(?) ;;-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

.CODE ; marque le début de CSMAIN PROC FAR ; Point d’entrée du programme pour le DOS

MOV AX, @DATA ; charger l’adresse du segment de donnéesMOV DS, AX ; assigner une valeur a DS

CALL SUBR_1CALL SUBR_2

MOV AH, 4Ch ; retourne le control au DOSINT 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

Page 18: Chapitre 2 : Le Langage Assembleur dIntel 80x86 Section 2.1:Directives Section 2.2: Éditer, Assembler, Lier et Exécuter un programme Section 2.3: Quelques.

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 offsetDB (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écimale0001 9D DATA2 DB 10011101B ; Binaire0002 12 DATA3 DB 12H ; Hexadécimale0010 ORG 0010H ; Adresse offset

0010 37 36 38 31 DATA4 DB ‘7681’ ; Nombres ASCII

0018 ORG 0018H0018 00 DATA5 DB ? ; Réserver un octet0020 ORG 0020H

0020 4D 6F 6E 20 6E 6F 4D DATA6 DB ‘Mon nom’ ; Caractères ASCII 0070 ORG 0070H0070 BA03 0C00 3B00 4948 DATA7 DW 954, 0CH, 00111011B, ‘HI’ ; 0098 ORG 0098H0098 FDFF0000 023AB500 0C3B0000 DATA8 DD 65533, 23AB5H, 110000111011B ; 00B0 ORG 00B0H00B0 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

Page 19: Chapitre 2 : Le Langage Assembleur dIntel 80x86 Section 2.1:Directives Section 2.2: Éditer, Assembler, Lier et Exécuter un programme Section 2.3: Quelques.

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

Page 20: Chapitre 2 : Le Langage Assembleur dIntel 80x86 Section 2.1:Directives Section 2.2: Éditer, Assembler, Lier et Exécuter un programme Section 2.3: Quelques.

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 SSDB 32 DUP (?) ;

STSEG ENDS ; marque la fin de SS;---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------DTSEG SEGMENT ; marque le début de DSDATA_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 offsetSUM DW ? ; SUM. Les allocations mémoire sont de type DW. DTSEG ENDS ; marque la fin de DS;---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------CDSEG SEGMENT ; marque le début de CSMAIN 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 DSMOV 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 4MOV 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 BXINC DI ; Incrémenter DI une foisINC DI ; Incrémenter DI deux foisDEC CX ; Décrémenter la boucle du compteur JNZ ADD_LP ; Sauter a l’instruction labelée par ADD_LP si le compteur est nonzeroMOV SI, OFFSET SUM; charger un pointeur SI pour la variable SUMMOV [SI], BX ; stocker la donnée dans BX a la location pointée par SI, i.e. SUMMOV AH, 4Ch ; retourne le control au DOSINT 21h ; retourne le control au DOS

MAIN ENDP ; fin de la procédure MAINCDSEG ENDS ; marque la fin de CS

END MAIN ; point de sortie du programme

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

20/21

Page 21: Chapitre 2 : Le Langage Assembleur dIntel 80x86 Section 2.1:Directives Section 2.2: Éditer, Assembler, Lier et Exécuter un programme Section 2.3: Quelques.

Section 2.6 : Fichiers “.COM” et “.EXE”Fichier EXE Fichier COM (P8080/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 SEGMENTORG 100HASSUME CS:CODSG, DS:CODSG, ES:CODSG

;--------------------------l ‘aire du code ----------------------------------------------PROGCODE PROC NEAR

MOV AX, DATA1ADD AX, DATA2MOV SUM, AXMOV AH, 4CHINT 21H

PROGCODE ENDP;--------------------------l ‘aire des donnees----------------------------------------DATA1 DW 2390DATA1 DW 3456SUM DW ?;---------------------------------------------------------------------------------------------CODSG ENDS

END PROGCODE

TITLE prog2_5.com: Addition de 2 mots PAGE 60, 132

CODSG SEGMENTORG 100HASSUME CS:CODSG, DS:CODSG, ES:CODSG

DEBUT: JMP PROGCODE ; surpasse l’aire Don.;--------------------------l ‘aire des donnees----------------------------------------DATA1 DW 2390DATA1 DW 3456SUM DW ?;--------------------------l ‘aire du code ----------------------------------------------PROGCODE MOV AX, DATA1

ADD AX, DATA2MOV SUM, AXMOV AH, 4CHINT 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