Académique Documents
Professionnel Documents
Culture Documents
Un Bon Resume Asc Dxsemble Ur
Un Bon Resume Asc Dxsemble Ur
Remarques prliminaires :
Certaines instructions, comme PUSHA, ne sont disponibles que pour des modles
de processeurs plus volus que le 8086, par exemple le 286. Noubliez pas la
directive .386 si vous les utilisez.
Remarques : Source et Destination doivent avoir la mme taille. On ne peut charger dans un
registre de segment que le contenu dun registre gnral (SI, DI et BP sont considrs ici
comme des registres gnraux).
Un saut conditionnel nest effectu qu certaines conditions portant sur les flags (par
exemple : CF = 1 ou ZF = 0).
Certains mnmoniques de sauts conditionnels sont totalement quivalents, cest--dire quils
reprsentent le mme opcode hexadcimal. Cest pour aider le programmeur quils existent
parfois sous plusieurs formes.
a) les sauts de comparaison
JE ( Jump if Equal ) fait un saut au label spcifi si et seulement si ZF = 1.
Rappelez-vous que ce flag est 1 si et seulement si le rsultat de lopration
prcdente vaut zro. Comme CMP ralise une soustraction, on utilise gnralement
JE pour savoir si deux nombres sont gaux.
Exemple :
Exemple :
Remarques : Ce mnmonique correspond au mme opcode que JB. Il est souvent employ
pour vrifier que lappel dune interruption na pas dclench derreur.
Exemple :
Si lappel de la fonction 3Eh de linterruption 21H se solde par une erreur, alors la CF vaudra
1 et le saut sera accompli. Dans le cas oppos, lexcution continuera normalement de
manire linaire.
Si Source est un octet : AL est multipli par Source et le rsultat est plac dans AX.
Si Source est un mot : AX est multipli par Source et le rsultat est plac dans DX:AX.
Si Source est un double mot : EAX est multipli par Source et le rsultat est plac dans
EDX:EAX.
Si Source est un octet : AL est multipli par Source et le rsultat est plac dans AX.
Si Source est un mot : AX est multipli par Source et le rsultat est plac dans DX:AX.
Si Source est un double mot : EAX est multipli par Source et le rsultat est plac dans
EDX:EAX.
IMUL Destination, Source : Multiplie Destination par Source et place le rsultat dans
Destination.
IMUL Destination, Source, Valeur : Multiplie Source par Valeur et place le rsultat dans
Destination.
7
Si Source est un octet : AX est divis par Source, le quotient est plac dans AL et le
reste dans AH.
Si Source est un mot : DX:AX est divis par Source, le quotient est plac dans AX et
le reste dans DX.
Si Source est un double mot : EDX:EAX est divis par Source, le quotient est plac
dans EAX et le reste dans EDX.
Si Source est un octet : AX est divis par Source, le quotient est plac dans AL et le
reste dans AH.
Si Source est un mot : DX:AX est divis par Source, le quotient est plac dans AX et
le reste dans DX.
Si Source est un double mot : EDX:EAX est divis par Source, le quotient est plac
dans EAX et le reste dans EDX.
Cet oprateur est souvent utilis pour tester certains bits de Destination.
Indicateurs affects : CF, OF, PF, SF, ZF
Exemple :
10
12
Indicateurs affects : IF
f) linstruction STI ( Set Interrupt flag )
Syntaxe : STI
Description : Met IF 1.
Indicateurs affects : IF
g) linstruction CMC ( Complement Carry flag )
Syntaxe : CMC
Description : Inverse CF.
Indicateurs affects : CF
h) linstruction LAHF ( Load AH from Flags )
Syntaxe : LAHF
Description : Charge dans AH loctet de poids faible du registre des indicateurs.
i) linstruction SAHF ( Store AH into Flags )
Syntaxe : SAHF
Description : Stocke les bits de AH dans le registre des indicateurs.
10. Les instructions de gestion de la pile
a) linstruction PUSH ( Push Word onto Stack )
Syntaxe : PUSH Source
Description : Empile le mot Source. SP est dcrment de 2.
Remarques : Source ne peut tre une valeur immdiate. Il est possible dabrger votre code
source en crivant par exemple PUSH AX BX BP. Le compilateur crira alors trois fois
linstruction PUSH du langage machine. Il est possible galement dempiler des doubles
mots.
b) linstruction POP ( Pop Word off Stack )
13
15
Exemple :
16
Remarque : Possibilit dutiliser les prfixes de rptition, de mme que pour SCASB.
17
Description : Stocke le contenu de EAX dans le double mot adress par ES:DI. Si DF = 0,
alors DI est ensuite incrment de 4, sinon il est dcrment de 4.
Remarque : Possibilit dutiliser les prfixes de rptition, de mme que pour STOSB.
e) linstruction CMPSD ( Compare String Double Word )
Syntaxe : CMPSD
Description : Compare le double mot adress par DS:SI et celui adress par ES:DI. Si DF = 0,
alors SI et DI sont ensuite incrments de 4, sinon ils sont dcrments de 4.
Remarque : Possibilit dutiliser les prfixes de rptition, de mme que pour CMPSB.
19
20
Syntaxe : CBW
Description : Convertit loctet sign stock dans AL en un mot (sign) stock dans AX. Ainsi,
si AL est ngatif, AH sera rempli de 1 binaires, sinon, AH sera mis 0.
f) linstruction CWD ( Convert Word to Double Word )
Syntaxe : CWD
Description : Convertit le mot sign stock dans AX en un double mot (sign) stock dans
DX:AX. Ainsi, si AX est ngatif, DX sera rempli de 1 binaires, sinon DX sera mis 0.
g) linstruction DAA ( Decimal Adjust for Addition )
h) linstruction DAS ( Decimal Adjust for Substraction )
i) linstruction MOVSX ( Move with Sign Extend )
Syntaxe : MOVSX Destination, Source
Description : Dplace le contenu sign dun registre de 8 bits dans un registre de 16 bits, ou
bien dplace le contenu sign dun registre de 16 bits dans un registre de 32 bits. Si Source est
ngatif, la partie haute de Destination sera remplie de 1 binaires, sinon elle sera remplie de 0.
j) linstruction MOVZX ( Move with Zero Extend )
Syntaxe : MOVZX Destination, Source
Description : Dplace le contenu non sign dun registre de 8 bits dans un registre de 16 bits,
ou bien dplace le contenu sign dun registre de 16 bits dans un registre de 32 bits. La partie
haute de Destination sera donc mise 0.
22
Pour lire ou crire des donnes dans un fichier, il est ncessaire de l'ouvrir, c'est--dire de le
charger en mmoire. Quand toutes les oprations de lecture et d'criture auront t effectues,
le fichier devra tre referm afin d'enregistrer les ventuelles dernires modifications et
surtout de librer la mmoire occupe.
1. Ouverture d'un fichier
On ouvre un fichier en appelant la fonction 3dh de l'interruption 21h. Celle-ci attend comme
paramtre dans DS:DX l'adresse d'une chane de caractres qui contient le chemin d'accs au
fichier sur un disque, par exemple C:\MonDoss\MonFic.txt.
Remarque : il n'est pas indispensable de mentionner le chemin d'accs complet : par dfaut, le
fichier sera cherch partir du dossier courant.
Remarque: La chane doit tre imprativement suivie de l'octet 00h qui sert marquer sa fin.
Il nous faut galement spcifier le mode d'accs en crivant dans AL un 0 (si on veut ouvrir le
fichier en lecture seule), un 1 (si on veut l'ouvrir en criture seule) ou un 2 (lecture ET
criture).
Si l'interruption choue, le flag CF sera mis 1 sans que le fichier soit ouvert. Dans le cas
contraire, CF est mis 0 et le registre AX contient un petit nombre entier (par exemple 5)
appel handle (ce qui signifie poigne ) du fichier. Ce handle reprsente le fichier.
C'est lui qu'il faudra dsormais invoquer pour effectuer des oprations de lecture ou
d'criture, et non pas le chemin d'accs.
En effet, les chemins d'accs ne sont donc plus d'aucune utilit puisque les fichiers sont
ouverts dans la mmoire vive.
2. Lecture dans un fichier
Une fois le fichier ouvert, on peut le lire avec la fonction 3fh. Il suffit de mentionner le handle
dans BX, le nombre d'octets lire dans CX, et l'adresse d'un buffer dans DS:DX.
Au cas o vous ne sauriez pas ce qu'est un buffer (ou tampon), sachez que c'est simplement
une variable (gnralement une chane de caractres) destine recevoir des donnes (ou en
fournir). Dans notre cas, le buffer va recevoir les octets lus dans le fichier.
Aprs l'appel, AX contient le nombre d'octets qui ont t effectivement lus (il peut tre
infrieur la taille demande si le fichier n'est pas assez long). En cas de problme, CF sera
mis 1.
Les donnes sont crites sur le disque ds que le tampon (dans la mmoire vive) est plein.
4. Existence d'un pointeur de fichier
Une question se pose cependant : quel endroit du fichier les donnes sont-elles lues (ou
crites) ?
Rponse : quand un fichier est ouvert, un pointeur spcial pointant vers le dbut du fichier est
cr. La premire opration de lecture (ou d'criture) se fera donc au dbut du fichier.
Mais entre chaque opration, le pointeur est incrment de la taille des donnes que l'on a lues
(ou crites). La deuxime opration se fera donc sur les octets qui suivent ceux de la premire.
Remarque : Il est possible de modifier directement le pointeur de fichier : voyez pour cela la
fonction 42h...
5. Fermeture d'un fichier
Pour terminer, le fichier doit tre referm. Les modifications ventuellement apportes et non
enregistres seront crites sur le disque, et le handle sera libr. C'est la fonction 3eh qui se
charge de tout cela. Elle attend simplement le handle du fichier dans BX. Et comme
d'habitude, CF vaut 1 aprs l'appel si des erreurs ont t rencontres.
Remarque : Attention lorsque vous laissez le fichier ouvert longtemps afin d'y ajouter
progressivement des donnes ! Si le systme plante, vous perdrez les donnes qui se trouvent
dans le tampon ce moment. C'est pourquoi il est conseill de forcer rgulirement l'criture
sur le disque en refermant le fichier.
6. Conclusion Le tableau suivant rcapitule ces diffrentes tapes :
Fonction
Description
Paramtres
3dh
Ouvrir le fichier
3eh
Fermer le fichier
- BX : handle
3fh
Lire le fichier
- BX : handle
- CX : nombre d'octets
- DS:DX : adresse d'un buffer
- BX : handle
- CX : nombre d'octets
- DS:DX : adresse d'un buffer
40h
24
Signification
Lecture seule
Fichier cach
Fichier systme
Volume
Rpertoire
Fichier
(Aucune...)
(Aucune...)
Pour demander la fonction 4eh de ne pas oublier les fichiers cachs, il suffit donc de charger CX avec la
valeur 2 (bit numro 2 = 1). De mme, l'attribut 00000111b (soit 7) nous permettra de trouver les fichiers en
lecture seule, les fichiers cachs et les fichiers systmes.
Remarque : Ne vous souciez pas trop des bits numro 4 et 6. Laissez-les 0.
Une fois que les paramtres ont t ajusts, on peut appeler la fonction 4eh. Si aucun fichier n'a t trouv, le
flag CF est mis 1. On doit donc fait un test sur CF pour savoir si la recherche peut continuer ou si elle doit
s'arrter.
25
Si au contraire la fonction a trouv un fichier, les caractristiques de ce fichier (i.e. son nom, sa taille, ses
attributs,...) sont inscrits dans une zone de la mmoire appele DTA ( Disk Tranfer Area ).
Mais o se trouve donc cette DTA et quoi ressemble-t-elle ?
Rponse : par dfaut, le DOS place la DTA dans le PSP de votre programme, l'offset 80h.
Remarque : il vous est naturellement possible de la dplacer en faisant appel la fonction 1ah.
Voici la structure de la DTA :
Adresse
Description
Taille (octets)
00h
01h
Modle de la recherche
11
0Ch
Rserv
15h
Attributs du fichier
16h
Heure du fichier
18h
Date du fichier
1Ah
Taille du fichier
1Eh
13
Puisque par dfaut la DTA est situe dans le PSP l'offset 80h, le nom du fichier trouv est crit l'offset
80h + 1eh = 9eh. De mme, la taille se trouve l'offset 9ah, etc...
2. La fonction 4fh
Jusqu' prsent, nous n'avons trouv qu'un seul fichier ! Pour poursuivre la recherche, appelez la fonction 4fh
sans crire aucun paramtre dans les registres. Les caractristiques de votre recherche ont t mmorises
dans la DTA : vous n'avez donc pas les rappeler. De mme que pour la fonction 4eh, CF est mis 1 si
aucun nouveau fichier n'a t trouv. C'est le signe que vous pouvez arrter votre recherche.
3. Conclusion : Rsumons nous :
Fonction
Description
Paramtres
4eh
4fh
Aucun !
26
A titre d'exemple, crivons prsent le programme que nous voquions tout l'heure : trouver tous les
fichiers COM du dossier courant et les effacer.
27
28
Un exemple de prgramme
1. Entre bufferise au clavier
L'exemple que nous proposons ici fait appel une saisie au clavier. Comme nous n'en n'avons pas encore
rencontr, ce paragraphe explique brivement comment utiliser les fonctions 0ah et 0ch.
On peut se servir de la fonction 0ah pour lire une chane de caractres au clavier. Le seul paramtre
fournir est l'adresse d'un buffer. Comme il est souvent indispensable d'effacer le buffer avant la lecture, il
est prfrable de ne pas utiliser la fonction 0ah directement mais d'appeler la fonction 0ch. En effet, celleci commence par effacer le buffer, puis appelle la fonction 0ah (ou une fonction voisine dont le numro
doit tre transmis dans AL).
Voici le code crire :
La seule difficult est dans la dclaration du buffer. Voici comment vous devez vous y prendre si vous
considrez que l'utilisateur pourra entrer au plus n caractres :
Le premier octet de maChaine doit contenir le nombre d'octets maximal qui pourra tre entr, plus 1.
Pourquoi plus 1 ? Tout simplement parce que le DOS met la fin des caractres taps le code ASCII 13
(retour chariot).
Pour comprendre la suite de la dclaration, il faut savoir de quelle manire le DOS transmet les caractres
qui ont t lus. Aprs la lecture, le deuxime octet du buffer contiendra le nombre exact d'octets lus (sans
compter le 13 final). La chane proprement dite ne commencera donc qu'au troisime octet. Puisqu'un
octet est utilis pour donner au DOS le nombre maximal de caractres autoris, un autre pour recevoir le
nombre de caractres lus effectivement, et encore un autre pour recevoir le code ASCII 13, le buffer doit
comporter trois octets de plus que la taille maximale de la chane. C'est pourquoi on crit :
maChaine db n+1, ?, n dup(?), ?
2. Le programme
Le programme suivant demande l'utilisateur d'entrer le nom d'un fichier se trouvant dans le dossier
courant puis crypte ce fichier en appliquant un NOT logique sur chaque octet. Naturellement, il n'est pas
optimis du tout. Ce n'est qu'un exemple !
Suggestion : quand vous aurez compris ce petit programme, essayez donc de l'amliorer ! Par exemple, il
faudrait que l'utilisateur puisse taper le nom du fichier crypter directement comme paramtre du
programme (i.e. CRY MONFICH.EXE). Voyez pour cela la structure du PSP telle que prsente dans la
29
premire partie. De plus, le programme devrait pouvoir trouver automatiquement le nom du fichier
d'arrive : ce serait le mme que celui du fichier crypter, mais avec une extension diffrente (par
exemple .cry).
Vous pourriez galement tendre les possibilits du logiciel en permettant l'utilisateur de saisir non plus
un simple nom de fichier, mais un masque complexe avec des chemins d'accs et des caractres jokers
comme '*' et '?'. Vous aurez donc besoin des fonctions de recherche 4eh et 4fh. L'utilisateur doit de
surcrot pouvoir choisir s'il veut crypter un fichier ou bien le dcrypter...
Voici un exemple de macro qui renvoie dans AL le nombre de chiffres dun entier non sign
de deux octets pass dans AX :
Remarque: Il doit tre clair que la liste des interruptions du DOS est importante. Vous ne
pourrez rien faire si vous nen avez pas !
30