La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Chapitre 2 : Le Langage Assembleur d’Intel 80x86

Présentations similaires


Présentation au sujet: "Chapitre 2 : Le Langage Assembleur d’Intel 80x86"— Transcription de la présentation:

1 Chapitre 2 : Le Langage Assembleur d’Intel 80x86
1/21 Chapitre 2 : Le Langage Assembleur d’Intel 80x86 Section 2.1: Directives Section 2.2: Éditer, Assembler, Lier et Exécuter un programme Section 2.3: Quelques exemples Section 2.4: Instructions “control de transfert” Section 2.5: Définition de données et leurs types Section 2.6: Définition du “Segment Complet” Section 2.7: Fichiers “.COM” et “. EXE” R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs Rachid Beguenane

2 Objectives Les objectifs de ce chapitre sont:
2/21 Objectives Les objectifs de ce chapitre sont: Expliquer la différence entre les instructions et pseudo-instructions dans le langage Assembleur. Identifier les segments dans un programme en langage Assembleur. Comment Éditer, Assembler, Lier, et Exécuter un programme simple en langage Assembleur. Différencier entre les différentes instructions de contrôle de transfert, conditionnelles et inconditionnelles comme JMP et CALL. Connaître quelques directives de données en langage Assembleur. Écrire un programme en langage Assembleur en utilisant la définition des segments complet et simplifie. Expliquer la différence entre les fichier “.COM” et “.EXE” et les avantages de chacun des deux types. R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs

3 Section 2.1 Directives 3/21 R. Beguenane, UQAC, 2002/2003
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 ; 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 ; DATA indique le début de DS MOV DS, AX ; et non MOV 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

4 Section 2.2 Éditer, Assembler, Lier et Exécuter un programme
4/21 Section 2.2 Éditer, Assembler, Lier et Exécuter un programme Étape Entrée Programme (Logiciel) Sortie 1. Édition du programme Clavier Éditeur (DOS, Word, etc.) fichier.asm 2. Assembler le programme MASM ou TASM fichier.obj 3. Lier le programme LINK ou TLINK fichier.exe 4. Exécuter le programme DEBUG Écran Code Machine EDITEUR C> TASM A: fichier.asm <Entrée> … Compilation  rapports, erreurs …. C> TLINK A: fichier.obj <Entrée> C> DEBUG A: fichier.exe <Entrée> … Commandes: -U CS:0 1 <Entrée> -D 1066:0 F <Entrée> -G <Entrée> -Q 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.asm PROGRAMME ASSEMBLEUR fichier.lst (option / l) (opcodes, adresses, err) autres_fich.obj fichier.obj Note Pour localiser les segments de D et C dans la mémoire. (Avec TASM: tasm /zi) PROGRAMME LINK fichier.map fichier.exe R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs

5 Section 2.3 : Quelques Exemples de Programmes
5/21 Section 2.3 : Quelques Exemples de Programmes La location ou le DOS chargera le programme dépendra de la taille de la RAM et de la version du DOS. Les valeurs de CS, DS ou l’adresse d’une instruction particulière (comme MOV A, xxxx) peuvent avoir des valeurs différentes dans les 3 exemples suivants, ne tentez pas de changer les adresses de CS ou DS sinon le système s’arrêtera. Programme 1: PAGE 60, 132 TITLE prog2_1.asm: Addition de 5 octets (25h, 12h, 15h, 1Fh, et 2Bh) et stocker le résultat (sous entendu dans A) .MODEL SMALL ; définit le modèle de mémoire comme petit .STACK 64 ; marque le début de SS, et lui réserve 64Ko ; DATA ; marque le début de DS DATA_IN DB 25h, 12h, 15h, 1Fh, 2Bh ; Le DS définit 5 données et une donnée résultat SUM DB ? ; SUM. Les allocations mémoire sont de type DB. ; .CODE ; marque le début de CS MAIN PROC FAR ; Entrée du progam. avec PROCedure étiquetée MAIN d’option FAR MOV ; 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 INT 21h ; 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 R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs

6 Section 2.3 : Quelques Exemples de Programmes
6/21 Section 2.3 : Quelques Exemples de Programmes Après que le programme soit assemblé (tasm prog1_1.asm) et linké (tlink prog1_1.obj), l’exécution par DEBUG (debug prog1_1.exe) donne, avec les commandes –u, -d, -g et -q: C> debug prog2_1.exe -u cs:0:19 0B75:0000 B8770B MOV AX, 0B77 0B75:0003 8ED8 MOV DS, AX 0B75:0005 B 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: MOV [0005], AL 0B75:0014 B44C MOV AH, 4C 0B75:0016 CD21 INT 21 -d 0B77:0 f 0B77: F 2B ….. -g Program terminated normally 0B77: F 2B ….. -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. DS CS Notez que l’octet LSB est stocké en (1er), i.e. l’adreese basse. R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs

7 Section 2.3 : Quelques Exemples de Programmes
7/21 Section 2.3 : Quelques Exemples de Programmes Programme 1b: PAGE 60, 132 TITLE prog2_1b.asm: Addition de 5 octets (25h, 12h, 15h, 1Fh, et 2Bh) et stocker le résultat (sous entendu dans A) .MODEL SMALL ; définit le modèle de mémoire comme petit .STACK 64 ; marque le début de SS, et lui réserve 64Ko ; DATA ; marque le début de DS DATA1 DB 25h ; Le DS définit une donnée: DATA1 DATA2 DB 12h ; Le DS définit une donnée: DATA2 DATA3 DB 15h ; Le DS définit une donnée: DATA3 DATA4 DB 1Fh ; Le DS définit une donnée: DATA4 DATA5 DB 2Bh ; Le DS définit une donnée: DATA5 ; les allocations mémoire sont de type DB. SUM DB ? ; Le DS définit une donnée résultat: SUM ; .CODE ; marque le début de CS MAIN PROC FAR ; Entrée du prog. avec PROCedure étiquetée MAIN d’option FAR MOV ; charger l’adresse du segment de données MOV DS, AX ; assigner une valeur a DS MOV AL, DATA1 ; Déplacer DATA1 vers AL ADD AL, DATA2 ; Ajouter la donnée DATA2 au registre Accumulateur A ADD AL, DATA3 ; Ajouter la donnee DATA3 au registre Accumulateur A ADD AL, DATA4 ; Ajouter la donnee DATA4 au registre Accumulateur A ADD AL, DATA5 ; Ajouter la donnee DATA5 au registre Accumulateur A MOV SUM, AL ; charger le résultat dans la location mémoire SUM MOV AH, 4Ch INT 21h ; retourne le control au DOS MAIN ENDP ; fin de la procédure MAIN END MAIN ; point de sortie du programme R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs

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

9 Section 2.3 : Quelques Exemples de Programmes
9/21 Section 2.3 : Quelques Exemples de Programmes Execution du Programme 2 C> debug prog2_2.exe -u cs:0:19 0B75:0000 B8770B MOV AX, 0B77 0B75:0003 8ED8 MOV DS, AX 0B75:0005 B90400 MOV CX, 0004 0B75:0008 BF0000 MOV DI, 0000 0B75:000B BB0000 MOV BX, 0000 0B75:000E 031D ADD BX, [DI] 0B75: INC DI 0B75: INC DI 0B75: DEC CX 0B75: FA 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 0B77: D3 xx xx xx xx xx xx xx xx xx xx xx xx xx xx . ….. -q C> ADD DI, 2 Addressage Indirect MOV SI, OFFSET SUM MOV [SI], BX 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. Autre solution Addressage Direct MOV SUM, BX 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 R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs

10 Section 2.3 : Quelques Exemples de Programmes
10/21 Section 2.3 : Quelques Exemples de Programmes Programme 3: PAGE 60, 132 TITLE prog3_3.asm: Transfert 6 octets de données des locations avec offset 0010h vers des locations avec offset 0028h .MODEL SMALL ; définit le modèle de mémoire comme petit .STACK 64 ; marque le début de SS, et lui réserve 64Ko ; DATA ; marque le début de DS ORG 15h DATA_IN DB 2Eh, 23h, 0D5h, 6Ah, 89h, 11h ; Le DS définit 6 données de type DB  notez que 0D5h et non D5h ORG 32h COPIE DB 6 DUP(?) ; pour dupliquer un certain nombre de caracteres: reserver 6 octets ; .CODE ; marque le début de CS MAIN PROC FAR ; Entrée du progam. avec PROCedure étiquetée MAIN d’option FAR MOV ; charger l’adresse du segment de données MOV DS, AX ; assigner une valeur a DS MOV SI, OFFSET DATA_IN ; SI pointe sur la donnée a copier. MOV DI, OFFSET COPIE ; DI pointe sur la COPIE de la données. MOV CX, 06h ; Compteur de boucle = 06 MOV_LP: MOV AL, [SI] ; Déplacer la prochaine donnée de l’espace DATA_IN vers AL MOV [DI], AL ; Déplacer la prochaine donnée vers l’espace COPIE INC SI ; Incrémenter SI INC DI ; Incrémenter DI DEC CX ; Décrémenter la boucle du compteur JNZ MOV_LP ; Sauter a l’instruction MOV_LP si le compteur est nonzero MOV AH, 4Ch ; retourne le control au DOS INT 21h ; retourne le control au DOS MAIN ENDP ; fin de la procédure MAIN END MAIN ; point de sortie du programme R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs

11 Section 2.3 : Quelques Exemples de Programmes
11/21 Section 2.3 : Quelques Exemples de Programmes 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: INC SI 0B75: INC DI 0B75: DEC CX 0B75: FA 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 xx xx xx xx xx . ….. 0B77:0030 xx xx 2E 23 D5 6A xx xx xx xx xx xx xx xx . ….. -q C> 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

12 Section 2.4 : Instructions “contrôle de transfert”
12/21 Section 2.4 : Instructions “contrôle de transfert” Dans la séquence des instructions à exécuter, il est souvent nécessaire de transférer le contrôle du programme vers différentes locations dans la mémoire. Intra-segment et Inter-segment: NEAR et FAR Si le contrôle est transféré dans une location à l’intérieur du code segment courant, il est de type NEAR (Intrasegment). Par contre, s’il se fait à l’extérieur, il est de type FAR (Inter-segment). Dans le premier cas seul le registre IP de l’adresse logique CS:IP est à mettre à jour, alors que les deux registres CS et IP sont à changer avec l’option FAR. Sauts conditionnels Avec le saut conditionnel, le contrôle est transféré vers une certaine location si une certaine condition est rencontrée. Le registre Flag est celui qui indique la condition courante. R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs

13 Section 2.4 : Instructions “contrôle de transfert”
13/21 Section 2.4 : Instructions “contrôle de transfert” Sauts conditionnels “Au dess(o)us réfère à la relation entre 2 valeurs non signées, alors que plus grand/ moins concerne 2 valeurs signées. Mnémonique Condition testée “Saut Si …” JA/JNBE (CF=0) et (ZF=0) Au dessus/non au dessous ni “zéro” JAE/JNB (CF=0) Au dessus ou égale/non au dessous JB/JNAE (CF=1) Au dessous/non au dessus ni égale JBE/JNA (CF or ZF) =0 Au dessous ou égale /non au dessus JC 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 Pas carry JNE/JNZ (ZF=0) Pas égale / pas zéro JNO (OF=0) Pas dépassement JNP/JPO (PF=0) Pas parité / parité impaire JNS (SF=0) Pas signe JO (OF=1) Dépassement JP/JPE (PF=1) Parité / parité égale JS (SF=1) Signe R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs

14 Section 2.4 : Instructions “contrôle de transfert”
14/21 Section 2.4 : Instructions “contrôle de transfert” Sauts courts Tout les sauts conditionnels sont des sauts courts, l’adresse de la cible est à l’intérieure de la bande [–128 : 127] octets autour de IP. Le saut conditionnel est une instruction à 2 octets: le 1er est l’opcode et le 2eme est une valeur entre 00h et FFh (soit un saut en arrière vers –128 et un saut en avant vers +127). 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: MOV [0005], AL Autre exemple: saut en avant BB ENCORE: MOV AL, [BX]+2 C 61 CMP AL, 61h 000A JB PROCHAINE 000C 3C 7A CMP AL, 7Ah 000E JA PROCHAINE DF AND AL, 0DFh PROCHAINE: MOV [SI], AL Adresse cible 11 + FA = 000Bh 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: = 0012h R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs

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

16 Section 2.4 : Instructions “contrôle de transfert”
16/21 Section 2.4 : Instructions “contrôle de transfert” Instruction de contrôle de transfert: CALL FAR ou NEAR Elle est utilisée pour appeler une procédure, une tache qui se répète fréquemment. L’adresse cible se trouve dans le segment CS courant (type NEAR, c’est le défaut), ou a l’extérieur (type FAR), i.e. en dehors du segment code. Quand le compilateur rencontre l’instruction CALL, il indique au 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: PUSH BX 0B75:0301 … … … …….:…… … … … … … 0B75:0209 5B POP BX 0B75:020A C3 RET . PUSH : IP = 0206 le IP doit être sauvegardé Avant l’exécution de la procédure 12 FFFCh BX FFFDh 95 06 Début de la procédure FFFEh IP 02 FFFFh POP : 0206 le IP doit être restitué Après l’exécution de la procédure PILE R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs

17 Section 2.4 : Instructions “contrôle de transfert”
17/21 Section 2.4 : Instructions “contrôle de transfert” Utilisation de CALL PAGE 60, 132 TITLE prog_generic.asm: …. .MODEL SMALL ; définit le modèle de mémoire comme petit .STACK 64 ; marque le début de SS, et lui réserve 64Ko ; DATA ; marque le début de DS DATA_IN DB 2Eh, 23h, 28h, 6Ah, 89h, 11h ; COPIE DB 6 DUP(?) ; ; .CODE ; marque le début de CS MAIN PROC FAR ; Point d’entrée du programme pour le DOS MOV ; 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 SUBR2 ENDP END MAIN ; point de sortie du programme R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs

18 Section 2.5 : Définition de données et leurs types
18/21 Section 2.5 : Définition de données et leurs types 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 mP 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”. DATA1 DB 25 ; Décimale D DATA2 DB B ; Binaire DATA3 DB 12H ; Hexadécimale ORG H ; Adresse offset DATA4 DB ‘7681’ ; Nombres ASCII ORG 0018H DATA5 DB ? ; Réserver un octet ORG 0020H D 6F 6E 20 6E 6F 4D DATA6 DB ‘Mon nom’ ; Caractères ASCII ORG 0070H 0070 BA03 0C00 3B DATA7 DW 954, 0CH, B, ‘HI’ ; ORG 0098H 0098 FDFF AB500 0C3B0000 DATA8 DD 65533, 23AB5H, B ; 00B0 ORG 00B0H 00B0 C DATA9 DQ 4523C2H, ‘HI’ ; 00C0 R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs

19 Section 2.5 : Définition de données et leurs types
19/21 Section 2.5 : Définition de données et leurs types DT (Define Ten bytes)  permet d’allouer des locations mémoire pour les nombres BCD (addition multioctet). 00E0 ORG 00E0H 00E DATA10 DT h ; BCD 00EA DATA11 DT ? ; rien DUP (Duplicate)  permet de dupliquer un certain nombre de caractères pour éviter de taper beaucoup. ORG 0030H 0030 AFAFAF…AF (16 fois) DATA12 DB AFh, …, 0AFh ; 16 octets de AF ORG 0050H 0050 AFAFAF…AF (16 fois) DATA12 DB DUP(0AFh) ; 16 octets de AF EQU (Equate)  permet de définir une constante sans occuper la mémoire. Dans le “Code Segment” Dans le “Data Segment” COUNT EQU 25 COUNT EQU 25 MOV CX, COUNT COUNTER DB COUNT (dans Data Segment) Notez la différence avec COUNT DB 25 MOV CX, COUNT  C’est un adressage direct contrairement au précédent (Adressage immédiat) Avantage de EQU: Si on désire changer une constante, utilisée plusieurs fois dans les segments code et données, on n’a pas a le faire dans plusieurs places en utilisant la directive EQU. R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs

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

21 Section 2.6 : Fichiers “.COM” et “.EXE”
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) Note: Pour convertir .exe  .com : Mais le fichier source doit être écrit sous format COM, I.e. l’une des 2 formes suivantes: .exe C>EXE2BIN A:PROG , A:PROG.com 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 R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs


Télécharger ppt "Chapitre 2 : Le Langage Assembleur d’Intel 80x86"

Présentations similaires


Annonces Google