Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
Objectives
Les objectifs de ce chapitre sont:
Note
Utile pour debuguer.
EDITEUR C> TASM A: fichier.asm <Entrée>
MASM taper fichier.lst ! more … Compilation rapports, erreurs ….
pour le voir. Utiliser la directives:
TITLE (60 caractères ASCII) et fichier.asm
PAGE 60, 132 ( defaut 66, 80).
Avec TASM: (tasm /l) C> TLINK A: fichier.obj <Entrée>
PROGRAMME … Compilation rapports, erreurs ….
ASSEMBLEUR
fichier.lst (option / l)
(opcodes, adresses, err) autres_fich.obj C> DEBUG A: fichier.exe <Entrée>
… Commandes:
fichier.obj -U CS:0 1 <Entrée>
Note
Pour localiser les segments PROGRAMME -D 1066:0 F <Entrée>
de D et C dans la mémoire.
(Avec TASM: tasm /zi) LINK -G <Entrée>
-D 1066:0 F <Entrée>
fichier.map fichier.exe -Q
Après que le programme soit assemblé (tasm prog1_1.asm) et linké (tlink prog1_1.obj), l’exécution
par DEBUG (debug prog1_1.exe) donne, avec les commandes –u, -d, -g et -q:
NOTES:
C> debug prog2_1.exe DS
CS 1.
-u cs:0:19 ADD AL, [BX] ajoute le contenu
0B75:0000 B8770B MOV AX, 0B77 de la location mémoire pointée par BX
0B75:0003 8ED8 MOV DS, AX au contenu de AL.
0B75:0005 B9 0500 MOV CX, 0005 Notez que l’octet LSB
0B75:0008 BB0000 MOV BX, 0000 est stocké en (1er), i.e. 2.
l’adreese basse.
0B75:000D 0207 ADD AL, [BX] INC BX incrémente le pointeur en
0B75:000F 43 INC BX ajoutant 1 au registre BX. Ceci force
0B75:0010 49 DEC CX BX à pointer sur le prochain octet
0B75:0011 75FA JNZ 000D
(prochaine donnée à additioner).
0B75:0013 020500 MOV [0005], AL
0B75:0016 B44C MOV AH, 4C 3.
0B75:0018 CD21 INT 21
Il y’a d’autres alternatives pour écrire
-d 0B77:0 f le même programme. Celui-ci définit
0B77:0000 25 12 15 1F 2B 00 00 00 00 00 00 00 00 00 00 00 . …..
un champ de données et utilise un
-g pointeur [BX] pour accéder à ses
Program terminated normally
éléments. Le programme qui suivra est
-d 0B77:0 f une autre façon d’écrire, en évitant la
0B77:0000 25 12 15 1F 2B 96 00 00 00 00 00 00 00 00 00 00 . ….. boucle et l’utilisation de pointeur. C’est
-q quoi son inconvénient?: fatiguant si
C> beaucoup de données à additionner
Adressage direct et indirect.
R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs
7/21
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
Programme 2:
PAGE 60, 132
TITLE prog2_2.asm: Addition de 4 mots (234Dh, 1DE6h, 3BC7h, et 566Ah) et stocker le résultat (dans A)
.MODEL SMALL ; définit le modèle de mémoire comme petit
.STACK 64 ; marque le début de SS, et lui réserve 64Ko
;-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
.DATA ; marque le début de DS
DATA_IN DW 234Dh, 1DE6h, 3BC7h, 566Ah ; Le DS définit 5 données et une donnée résultat
ORG 10h ; Note: La directive ORG permet d’assigner une adresse offset
; a une variable (nom). Ici SUM sera localisée a partir de 0010h.
SUM DW ? ; SUM. Les allocations mémoire sont de type DW.
;-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
.CODE ; marque le début de CS
MAIN PROC FAR ; Entrée du progam. avec PROCedure étiquetée MAIN d’option FAR
MOV AX, @DATA ; charger l’adresse du segment de données
MOV DS, AX ; assigner une valeur a DS
MOV CX, 04 ; Initialiser le compteur boucle a la valeur 4
MOV DI, OFFSET DATA_IN ; Assigner au pointeur de données DI l’adresse offset de DATA_IN.
MOV BX, 00 ; Initialiser BX
ADD_LP: ADD BX, [DI] ; Ajouter le contenu de la mémoire pointe par DI au registre BX
INC DI ; Incrémenter DI une fois
INC DI ; Incrémenter DI deux fois
DEC CX ; Décrémenter la boucle du compteur
JNZ ADD_LP ; Sauter a l’instruction labelée par ADD_LP si le compteur est nonzero
MOV SI, OFFSET SUM ; charger un pointeur SI pour la variable SUM
MOV [SI], BX ; stocker la donnée dans BX a la location pointée par SI, i.e. SUM
;MOV AH, 4Ch ; retourne le control au DOS
INT 3h ;INT 21h ; retourne le control au DOS
MAIN ENDP ; fin de la procédure MAIN
END MAIN ; point de sortie du programme
Execution du Programme 2
Programme 3:
PAGE 60, 132
TITLE prog3_3.asm: Transfert 6 octets de données des locations avec offset 0010h vers des locations avec offset 0028h
.MODEL SMALL ; définit le modèle de mémoire comme petit
.STACK 64 ; marque le début de SS, et lui réserve 64Ko
;-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
.DATA ; marque le début de DS
ORG 15h
DATA_IN DB 2Eh, 23h, 0D5h, 6Ah, 89h, 11h ; Le DS définit 6 données de type DB notez que 0D5h et non D5h
ORG 32h
COPIE DB 6 DUP(?) ; pour dupliquer un certain nombre de caracteres: reserver 6 octets
;-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
.CODE ; marque le début de CS
MAIN PROC FAR ; Entrée du progam. avec PROCedure étiquetée MAIN d’option FAR
MOV AX, @DATA ; charger l’adresse du segment de données
MOV DS, AX ; assigner une valeur a DS
MOV SI, OFFSET DATA_IN ; SI pointe sur la donnée a copier.
MOV DI, OFFSET COPIE ; DI pointe sur la COPIE de la données.
MOV CX, 06h ; Compteur de boucle = 06
MOV_LP: MOV AL, [SI] ; Déplacer la prochaine donnée de l’espace DATA_IN vers AL
MOV [DI], AL ; Déplacer la prochaine donnée vers l’espace COPIE
INC SI ; Incrémenter SI
INC DI ; Incrémenter DI
DEC CX ; Décrémenter la boucle du compteur
JNZ MOV_LP ; Sauter a l’instruction MOV_LP si le compteur est nonzero
MOV AH, 4Ch ; retourne le control au DOS
INT 21h ; retourne le control au DOS
MAIN ENDP ; fin de la procédure MAIN
END MAIN ; point de sortie du programme
Execution du Programme 3
NOTE IMPORTANTE:
C> debug prog2_3.exe 1.
-u cs:0:19 L’une des taches du DOS est de déterminer le
0B75:0000 B8770B MOV AX, 0B77
montant total de la RAM installée dans le PC.
0B75:0003 8ED8 MOV DS, AX Le DOS utilise la portion dont il a besoin pour le
0B75:0005 BF0000 MOV SI, 0015 Système d’opération et alloue le reste.
0B75:0008 BF0000 MOV DI, 0032
0B75:000B B90400 MOV CX, 0006 2.
0B75:000E 031D ADD AL, [SI] Mais un programme ne peut dicter les adresses
0B75:0010 031D ADD [DI], AL
0B75:0012 47 INC SI
physiques exactes des locations mémoires pour la
0B75:0013 47 INC DI pile et autres segments, a partir du moment que la
0B75:0014 49 DEC CX gestion de la mémoire incombe au de la responsabilité
0B75:0015 75FA JNZ 000E
du seul DOS, qui avec l’aide du programme LINK,
0B75:0017 B44C MOV AH, 4C
0B75:0019 CD21 INT 21 assemble les programmes dans la mémoire du PC.
-g
3.
Program terminated normally Il est recommande d’avoir un seul segment de pile
-d 0B77:0 3f
pour éviter la fragmentation de la RAM par le pile.
0B77:0000 mais il n’est pas interdit d’avoir plusieurs segments
xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx . …..
0B77:0010 xx xx xx xx xx 2E 23 D5 6A 89 11 xx xx xx xx xx . de
…..code et de données. C’est la responsabilité de LINK
0B77:0030 xx xx 2E 23 D5 6A 89 11 xx xx xx xx xx xx xx xx . …..
de combiner les différents segments de codes et
-q données pour créer un seul programme exécutable
C>
avec un seul segment de pile, qui est la pile du système.
R. Beguenane, UQAC, 2002/2003 Systèmes à microprocesseurs
12/21
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.
Tout les sauts conditionnels sont des sauts courts, l’adresse de la cible est à l’intérieure de la
bande [–128 : 127] octets autour de IP. Le saut conditionnel est une instruction à 2 octets:
le 1er est l’opcode et le 2eme est une valeur entre 00h et FFh (soit un saut en arrière vers –
128 et un saut en avant vers +127).
Adresse cible
0B75:0008 BB0000 MOV BX, 0000
0B75:000D 0207 ADD AL, [BX] 13 + FA = 000Dh
0B75:000F 43 INC BX
Adresse prochaine Adresse de l’instruction avec label
0B75:0010 49 DEC CX
instruction (vers laquelle le saut s’effectue)
0B75:0011 75FA JNZ 000D
0B75:0013 020500 MOV [0005], AL
FA est le “Complément à 2” de - 6
l’adresse cible est – 6 octets de l’IP
Autre exemple: saut en avant de la prochaine instruction (0013h)
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é.
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
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.