1 / 21

Chapitre 2 : Le Langage Assembleur d’Intel 80x86

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

Télécharger la présentation

Chapitre 2 : Le Langage Assembleur d’Intel 80x86

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 1/21 R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs 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”

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

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

  4. 4/21 R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs Section 2.2Éditer, Assembler, Lier et Exécuter un programme Code Machine EDITEUR 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 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

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

  6. 6/21 R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs 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 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:000F75FAJNZ000D • 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. DS CS Notez que l’octet LSB est stocké en (1er), i.e. l’adreese basse.

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

  8. 8/21 R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs 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 • JNZADD_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

  9. 9/21 ADD DI, 2 R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs Section 2.3 : Quelques Exemples de Programmes • Execution du Programme 2 • C> debug prog2_2.exe • -u cs:0:19 • 0B75:0000 B8770B MOV AX, 0B77 • 0B75:0003 8ED8 MOV DS, AX • 0B75:0005 B90400 MOV CX, 0004 • 0B75:0008 BF0000 MOV DI, 0000 • 0B75:000B BB0000 MOV BX, 0000 • 0B75:000E 031D ADD BX, [DI] • 0B75:0010 47 INC DI • 0B75:0011 47 INC DI • 0B75:0012 49 DEC CX • 0B75:001375FAJNZ000E • 0B75:0015BE1000 MOV SI, 0010 • 0B75:0018BE891C MOV [SI], BX • 0B75:001A B44C MOV AH, 4C • 0B75:001C CD21 INT 21 • -d 0B77:0 f • 0B77:0000 4D23E6 1DC73B6A56xxxxxxxxxxxxxx xx . ….. • 0B77:0010xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xx . ….. • -g • Program terminated normally • -d 0B77:0 f • 0B77:0000 4D23E6 1DC73B6A56xxxxxxxxxxxxxx xx . ….. • 0B77:001064D3xxxxxxxxxxxxxxxxxxxxxxxxxx xx . ….. • -q • C> Addressage Indirect MOVSI, 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 Little Endian Notez que l’octet LSB de SUM (D364) est stocké en (1er), i.e. l’adreese basse.

  10. 10/21 R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs 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 • JNZMOV_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

  11. 11/21 R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs 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:0012 47 INC SI • 0B75:0013 46 INC DI • 0B75:0014 49 DEC CX • 0B75:001575FAJNZ000E • 0B75:0017 B44C MOV AH, 4C • 0B75:0019 CD21 INT 21 • -g • Program terminated normally • -d 0B77:0 3f • 0B77:0000 xxxxxxxxxxxxxx xx xxxxxxxxxxxxxx xx . ….. • 0B77:0010xxxxxxxxxx2E23 D5 6A 89 11 xx xx xx xx xx. ….. • 0B77:0030xxxx2E23 D5 6A 89 11 xx xx xx xx xxxx xxxx. ….. • -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.

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

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

  14. 14/21 R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs 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:000F75FAJNZ000D • 0B75:0011 020500 MOV [0005], AL • Autre exemple: saut en avant • 0005 BB0000 ENCORE: MOV AL, [BX]+2 • 00083C 61 CMP AL, 61h • 000A72 06 JBPROCHAINE • 000C3C 7A CMP AL, 7Ah • 000E77 02 JAPROCHAINE • 0010 24 DF AND AL, 0DFh • 0012 88 04 PROCHAINE: MOV [SI], AL Adresse cible 11 + FA = 000Bh Adresse prochaine instruction Adresse de l’instruction avec label (vers laquelle le saut s’effectue) FAest le “Complément à 2” de - 6  l’adresse cible est – 6 octets de l’IP de la prochaine instruction (0011h) 1ersaut: 000C + 06 = 0012h 2emesaut: 0010 + 02 = 0012h

  15. 15/21 R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs 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é.

  16. 16/21 R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs 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:0203E8FA00CALL0300 • 0B75:0206 B82F14 MOV AX, 142F • …. • 0B75:030053PUSH BX • 0B75:0301……… • …….:……… … ……… • 0B75:02095BPOP BX • 0B75:020AC3RET . . . • PUSH : IP = 0206 • le IP doit être sauvegardé Avant l’exécution de la procédure 12 FFFCh BX 95 FFFDh 06 IP Début de la procédure FFFEh 02 FFFFh PILE • POP : 0206 • le IP doit être restitué Après l’exécution de la procédure

  17. 17/21 R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs Section 2.4 : Instructions “contrôle de transfert” • Utilisation de CALL • PAGE 60, 132 • TITLE prog_generic.asm: …. • .MODEL SMALL ; définit le modèle de mémoire comme petit • .STACK 64 ; marque le début de SS, et lui réserve 64Ko • ;----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- .DATA ; marque le début de DS • DATA_IN DB 2Eh, 23h, 28h, 6Ah, 89h, 11h; • COPIE DB 6 DUP(?) ; • ;----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- • .CODE ; marque le début de CS • MAIN PROC FAR ; Point d’entrée du programme pour le DOS • MOV AX, @DATA ; charger l’adresse du segment de données • MOV DS, AX ; assigner une valeur a DS • CALL SUBR_1 • CALL SUBR_2 • MOV AH, 4Ch ; retourne le control au DOS • INT 21h ; retourne le control au DOS • MAIN ENDP ; fin de la procédure MAIN • ;----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- • SUBR1 PROC • … • RET • SUBR1 ENDP • ;----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- • SUBR2 PROC • … • RET • SUBR2 ENDP • ;----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- • END MAIN ; point de sortie du programme

  18. 18/21 R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs 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 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 DB25 ; Décimale • 0001 9D DATA2 DB10011101B ; Binaire • 0002 12 DATA3 DB12H ; Hexadécimale • 0010 ORG 0010H ; Adresse offset • 0010 37 36 38 31 DATA4 DB‘7681’ ; Nombres ASCII • 0018ORG0018H • 0018 00 DATA5 DB ? ; Réserver un octet • 0020ORG0020H • 0020 4D 6F 6E 20 6E 6F 4D DATA6 DB‘Mon nom’ ; Caractères ASCII • 0070ORG0070H • 0070BA03 0C00 3B00 4948 DATA7DW954, 0CH, 00111011B, ‘HI’ ; • 0098ORG0098H • 0098FDFF0000 023AB500 0C3B0000 DATA8DD65533, 23AB5H, 110000111011B ; • 00B0ORG00B0H • 00B0C223450000000000 4948000000000000 DATA9DQ4523C2H, ‘HI’ ; • 00C0

  19. 19/21 R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs 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). • 00E0ORG00E0H • 00E0 29985643798600000000 DATA10 DT867943569829h ; BCD • 00EA 00000000000000000000 DATA11 DT? ; rien • DUP (Duplicate)  permet de dupliquer un certain nombre de caractères pour éviter de taper beaucoup. • 0030ORG0030H • 0030 AFAFAF…AF (16 fois) DATA12 DB0AFh, …, 0AFh ; 16 octets de AF • 0050ORG0050H • 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” • COUNTEQU25 COUNTEQU25 • MOV CX, COUNT COUNTER DB COUNT (dans Data Segment) • Notez la différence avec • COUNTDB25 • 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.

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

  21. 21/21 R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs Section 2.6 : Fichiers “.COM” et “.EXE” 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

More Related