Vous êtes sur la page 1sur 30

INSTRUCTIONS DU LANGAGE MACHINE

Remarques prliminaires :

Le principe du langage assembleur est de remplacer chaque opcode hexadcimal


par un mot facile retenir. Ce mot est appel mnmonique. Par exemple, INT
est le mnmonique associ lopcode CDh. Chaque fois que le compilateur
rencontrera ce mot, il le remplacera par loctet CDh et crira ensuite loprande
(ici : le numro de linterruption) en hexadcimal.

Cette liste rcapitule les instructions que nous connaissons dj et en prsente de


nouvelles. Elle nest pas exhaustive mais vous sera amplement suffisante pour la
plupart de vos programmes.

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.

1. Linstruction NOP ( No Operation )


Syntaxe : NOP
Description : Ne fait rien ! Mais alors RIEN ! Que dalle ! Niet !
2. Linstruction MOV ( Move )
Syntaxe : MOV Destination, Source
Description : Copie le contenu de Source dans Destination.
Mouvements autoriss :

MOV Registre gnral, Registre quelconque


MOV Mmoire, Registre quelconque
MOV Registre gnral, Mmoire
MOV Registre gnral, Constante
MOV Mmoire, Constante
MOV Registre de segment, Registre gnral

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).

Exemples : MOV AX, 5


MOV ES, DX
MOV AL, [Variable1] ;Copie un octet car AL contient 8 bits
MOV [Variable2], DS ;Copie un word car DS contient 16 bits
MOV word ptr [Variable3], 12 ;Ici, on spcifie que la variable est un word
3. Linstruction XCHG ( Exchange )
Syntaxe : XCHG Destination, Source
Description : Echange les contenus de Source et de Destination.
Mouvements autoriss : XCHG Registre gnral, Registre gnral
XCHG Registre gnral, Mmoire
XCHG Mmoire, Registre gnral
4. Linstruction JMP ( Jump )
Syntaxe : JMP MonLabel
Description : Saute linstruction pointe par MonLabel.
5. Loprateur CMP ( Compare )
Syntaxe : CMP Destination, Source
Description : Cet oprateur sert comparer deux nombres : Source et Destination. C'est le
registre des indicateurs qui contient les rsultats de la comparaison. Ni Source ni Destination
ne sont modifis.
Indicateurs affects : AF, CF, OF, PF, SF, ZF
Remarque : Cet oprateur effectue en fait une soustraction mais contrairement SUB, le
rsultat nest pas sauvegard.
Le programme doit pouvoir ragir en fonction des rsultats de la comparaison. Pour cela, on
utilise les sauts conditionnels (voir ci-dessous).
6. Les instructions de saut conditionnel
Les sauts conditionnels sont terriblement importants car ils permettent au programme de faire
des choix en fonction des donnes.
2

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 :

Mnmonique quivalent : JZ ( Jump if Zero )

JG ( Jump if Greater ) fait un saut au label spcifi si et seulement si ZF = 0 et SF


= OF. On lutilise en arithmtique signe pour savoir si un nombre est suprieur un
autre.

Exemple :

Mnmonique quivalent : JNLE ( Jump if Not Less Or Equal )


3

JGE ( Jump if Greater or Equal ) fait un saut au label spcifi si et seulement si SF


= OF. On lutilise en arithmtique signe pour savoir si un nombre est suprieur ou
gal un autre.

Mnmonique quivalent : JNL ( Jump if Not Less )

JL ( Jump if Less ) fait un saut au label spcifi si et seulement si SF <> OF. On


lutilise en arithmtique signe pour savoir si un nombre est infrieur un autre.

Mnmonique quivalent : JNGE ( Jump if Not Greater Or Equal )

JLE ( Jump if Less Or Equal ) fait un saut au label spcifi si et seulement si SF


<> OF ou ZF = 1. On lutilise en arithmtique signe pour savoir si un nombre est
infrieur ou gal un autre.

Mnmonique quivalent : JNG ( Jump if Not Greater )

JA ( Jump if Above ) fait un saut au label spcifi si et seulement si ZF = 0 et CF


= 0. On lutilise en arithmtique non signe pour savoir si un nombre est suprieur
un autre.

Mnmonique quivalent : JNBE ( Jump if Not Below Or Equal )

JAE ( Jump if Above or Equal ) fait un saut au label spcifi si et seulement si CF


= 0. On lutilise en arithmtique non signe pour savoir si un nombre est suprieur ou
gal un autre.

Mnmonique quivalent : JNB ( Jump if Not Below )

JB ( Jump if Below ) fait un saut au label spcifi si et seulement si CF = 1. On


lutilise en arithmtique non signe pour savoir si un nombre est infrieur un autre.

Mnmonique quivalent : JNAE ( Jump if Not Above Or Equal )

JBE ( Jump if Below or Equal ) fait un saut au label spcifi si et seulement si CF


= 1 ou ZF = 1. On lutilise en arithmtique non signe pour savoir si un nombre est
infrieur ou gal un autre.

Mnmonique quivalent : JNA ( Jump if Not Above )


b) les sauts de test sur les flags
Ces instructions testent un flag unique et excutent ou non le saut selon la valeur de ce
flag.

JC ( Jump if Carry ) fait un saut au label spcifi si et seulement si CF = 1.

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.

JNC ( Jump if not Carry ) fait un saut au label spcifi si et seulement si CF = 0.

JZ ( Jump if Zero ) fait un saut au label spcifi si et seulement si ZF = 1. Ce


mnmonique correspond au mme opcode que JE.

JNZ ( Jump if not Zero ) fait un saut au label spcifi si et seulement si ZF = 0. Ce


mnmonique correspond au mme opcode que JNE.

JS ( Jump if Sign ) fait un saut au label spcifi si et seulement si SF = 1.

JNS ( Jump if not Sign ) fait un saut au label spcifi si et seulement si SF = 0.

JO ( Jump if Overflow ) fait un saut au label spcifi si et seulement si OF = 1.

JNO ( Jump if not Overflow ) fait un saut au label spcifi si et seulement si OF = 0.

JP ( Jump if Parity ) fait un saut au label spcifi si et seulement si PF = 1.

JNP ( Jump if not Parity ) fait un saut au label spcifi si et seulement si PF = 0.


c) le saut de test sur le registre CX
JCXZ ( Jump if CX = Zero ) fait un saut au label spcifi si et seulement si CX = 0.

Les instructions arithmtiques


a) linstruction INC ( Increment )
5

Syntaxe : INC Destination


Description : Incrmente Destination.
Indicateurs affects : AF, OF, PF, SF, ZF
Exemple : INC CL
b) linstruction ADD ( Addition )
Syntaxe : ADD Destination, Source
Description : Ajoute Source Destination
Indicateurs affects : AF, CF, OF, PF, SF, ZF
Exemple : ADD byte ptr [VARIABLE + DI], 5
c) linstruction ADC ( Add with Carry )
Syntaxe : ADC Destination, Source
Description : Ajoute (Source + CF) Destination.
Indicateurs affects : AF, CF, OF, PF, SF, ZF
d) linstruction DEC ( Decrement )
Syntaxe : DEC Destination
Description : Dcrmente Destination.
Indicateurs affects : AF, OF, PF, SF, ZF
e) linstruction SUB ( Substract )
Syntaxe : SUB Destination, Source
Description : Soustrait Source Destination.
Indicateurs affects : AF, CF, OF, PF, SF, ZF
f) linstruction SBB ( Substract with Borrow )
Syntaxe : SBB Destination, Source

Description : Soustrait (Source + CF) Destination.


Indicateurs affects : AF, CF, OF, PF, SF, ZF
g) linstruction MUL ( Multiply )
Syntaxe : MUL Source
Description : Effectue une multiplication dentiers non signs.

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.

Indicateurs affects : CF, OF


Remarque : Source ne peut tre une valeur immdiate.
Exemples : MUL CX
MUL byte ptr [TOTO]
h) linstruction IMUL ( Integer Multiply )
Syntaxe : IMUL Source
IMUL Destination, Source
IMUL Destination, Source, Valeur
Description : Effectue une multiplication dentiers signs.
IMUL Source :

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

Indicateurs affects : CF, OF


i) linstruction DIV ( Divide )
Syntaxe : DIV Source
Description : Effectue une division euclidienne dentiers non signs.

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.

Indicateurs affects : AF, OF, PF, SF, ZF


Remarque : Source ne peut tre une valeur immdiate.
j) linstruction IDIV ( Integer Divide )
Syntaxe : IDIV Source
Description : Effectue une division euclidienne dentiers signs.

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.

Indicateurs affects : AF, CF, OF, PF, SF, ZF

k) linstruction NEG ( Negation )


Syntaxe : NEG Destination
Description : Forme le complment 2 de Destination, i.e. prend loppos de Destination.

Indicateurs affects : AF, CF, OF, PF, SF, ZF


Remarque : A ne pas confondre avec NOT, qui forme le complment 1.

8. Les instructions logiques


a) linstruction NOT ( Logical NOT )
Syntaxe : NOT Destination
Description : Effectue un NON logique bit bit sur Destination (i.e. chaque bit de
Destination est invers).
b) linstruction OR ( Logical OR )
Syntaxe : OR Destination, Source
Description : Effectue un OU logique inclusif bit bit entre Destination et Source. Le rsultat
est stock dans Destination.
Indicateurs affects : CF, OF, PF, SF, ZF
Remarque : Afin doptimiser la taille et les performances du programme, on peut utiliser
linstruction OR AX, AX la place de CMP AX, 0.
En effet, un OU bit bit entre deux nombres identiques ne modifie pas Destination et est
excut infiniment plus rapidement quune soustraction. Comme les flags sont affects,
les sauts conditionnels sont possibles.
c) linstruction AND ( Logical AND )
Syntaxe : AND Destination, Source
Description : Effectue un ET logique bit bit entre Destination et Source. Le rsultat est
stock dans Destination.
Indicateurs affects : CF, OF, PF, SF, ZF
d) linstruction TEST ( Test for bit pattern )
Syntaxe : TEST Destination, Source
Description : Effectue un ET logique bit bit entre Destination et Source. Le rsultat nest pas
conserv, donc Destination nest pas modifi. Seuls les flags sont affects.

Cet oprateur est souvent utilis pour tester certains bits de Destination.
Indicateurs affects : CF, OF, PF, SF, ZF
Exemple :

e) linstruction XOR ( Exclusive logical OR )


Syntaxe : XOR Destination, Source
Description : Effectue un OU logique exclusif bit bit entre Destination et Source. Le rsultat
est stock dans Destination.
Indicateurs affects : CF, OF, PF, SF, ZF
Remarque : Pour remettre un registre zro, il est prfrable de faire XOR AX, AX que
MOV AX, 0. En effet, le rsultat est le mme mais la taille et surtout la vitesse dexcution
de linstruction sont trs largement optimises.
f) linstruction SHL ( Shift logical Left )
Syntaxe : SHL Destination, Source
Description : Dcale les bits de Destination de Source positions vers la gauche. Les bits les
plus droite sont remplacs par des zros.
Indicateurs affects : AF, CF, OF, PF, SF, ZF
Exemple : SHL AX, 4 ;permet de multiplier par 16 de faon infiniment plus rapide que MUL
Mnmonique quivalent : SAL ( Shift Arithmetical Left )
g) linstruction SHR ( Shift logical Right )

10

Syntaxe : SHR Destination, Source


Description : Dcale les bits de Destination de Source positions vers la droite. Les bits les
plus gauche sont remplacs par des zros.
Indicateurs affects : AF, CF, OF, PF, SF, ZF
Mnmonique quivalent : SAR ( Shift Arithmetical Right )
h) linstruction ROL ( Rotate Left )
Syntaxe : ROL Destination, Source
Description : Effectue une rotation des bits de Destination de Source positions vers la gauche.
Le dernier bit tre sorti gauche et tre rentr droite est plac dans CF. OF est mis 1 si
et seulement si le signe de Destination a chang.
Indicateurs affects : AF, CF, OF, PF, SF, ZF
i) linstruction ROR ( Rotate Right )
Syntaxe : ROR Destination, Source
Description : Effectue une rotation des bits de Destination de Source positions vers la droite.
Le dernier bit tre sorti droite et tre rentr gauche est plac dans CF. OF est mis 1 si
et seulement si le signe de Destination a chang.
Indicateurs affects : AF, CF, OF, PF, SF, ZF
j) linstruction RCL ( Rotate through Carry Left )
Syntaxe : RCL Destination, Source
Description : Effectue une rotation des bits de Destination de Source positions vers la gauche.
CF est utilis comme intermdiaire : chaque bit qui sort gauche est plac dans CF, et le
contenu de CF est ensuite rinsr droite. OF est mis 1 si et seulement si le signe de
Destination a chang.
Indicateurs affects : AF, CF, OF, PF, SF, ZF
k) linstruction RCR ( Rotate through Carry Right )
Syntaxe : RCR Destination, Source
Description : Effectue une rotation des bits de Destination de Source positions vers la droite.
CF est utilis comme intermdiaire : chaque bit qui sort droite est plac dans CF, et le
11

contenu de CF est ensuite rinsr gauche. OF est mis 1 si et seulement si le signe de


Destination a chang.
Indicateurs affects : AF, CF, OF, PF, SF, ZF

Les instructions de manipulation des flags


a) linstruction CLC ( Clear Carry flag )
Syntaxe : CLC
Description : Met CF 0.
Indicateurs affects : CF
b) linstruction STC ( Set Carry flag )
Syntaxe : STC
Description : Met CF 1.
Indicateurs affects : CF
c) linstruction CLD ( Clear Direction flag )
Syntaxe : CLD
Description : Met DF 0.
Indicateurs affects : DF
d) linstruction STD ( Set Direction flag )
Syntaxe : STD
Description : Met DF 1.
Indicateurs affects : DF
e) linstruction CLI ( Clear Interrupt flag )
Syntaxe : CLI
Description : Met IF 0.

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

Syntaxe : POP Destination


Description : Dpile le mot qui se trouve au sommet de la pile et le place dans Destination. SP
est incrment de 2.
c) linstruction PUSHF ( Push Flags onto Stack )
Syntaxe : PUSHF
Description : Empile le registre des indicateurs. SP est dcrment de 2.
Remarque : PUSHFD empile le registre des indicateurs cod sur 32 bits.
d) linstruction POPF ( Pop Flags off Stack )
Syntaxe : POPF
Description : Dpile le mot qui se trouve au sommet de la pile et le place dans le registre des
indicateurs. SP est incrment de 2.
Indicateurs affects : Tous
Remarque : POPFD est utilis pour un registre des indicateurs cod sur 32 bits.
e) linstruction PUSHA ( Push All registers onto Stack )
Syntaxe : PUSHA
Description : Empile AX, BX, CX, DX, BP, SI, DI et SP.
Remarque : PUSHAD est utilis pour des registres de 32 bits.
f) linstruction POPA ( Pop All registers off Stack )
Syntaxe : POPA
Description : Restaure AX, BX, CX, DX, BP, SI, DI et SP partir de la pile.
Remarque : POPAD est utilis pour des registres de 32 bits.

11. Les instructions de gestion des chanes doctets


14

a) linstruction MOVSB ( Move String Byte )


Syntaxe : MOVSB
Description : Copie loctet adress par DS:SI ladresse ES:DI. Si DF = 0, alors DI et SI sont
ensuite incrments, sinon ils sont dcrments.
Remarque : Pour copier plusieurs octets, faire REP MOVSB ( Repeat Move String Byte ).
Le nombre doctets copier doit tre transmis dans CX de mme que pour un LOOP.
Exemple :

b) linstruction SCASB ( Scan String Byte )


Syntaxe : SCASB
Description : Compare loctet adress par ES:DI avec AL. Les rsultats sont placs dans le
registre des indicateurs. Si DF = 0, alors DI est ensuite incrment, sinon il est dcrment.
Remarques : Pour comparer plusieurs octets, faire REP SCASB ou REPE SCASB
( Repeat until Egal ), ou encore REPZ SCASB ( Repeat until Zero ). Ces trois prfixes
sont quivalents.
Le nombre doctets comparer doit tre transmis dans CX. La boucle ainsi cre sarrte si
CX = 0 ou si le caractre point par ES:DI est le mme que celui contenu dans AL (i.e. si ZF
= 1). On peut ainsi rechercher un caractre dans une chane.
Pour rpter au contraire la comparaison jusqu ce que ZF = 0, cest--dire jusqu ce que
AL et le caractre adress par ES:DI diffrent, utiliser REPNE ou REPNZ.

15

Exemple :

c) linstruction LODSB ( Load String Byte )


Syntaxe : LODSB
Description : Charge dans AL loctet adress par DS:SI. Si DF = 0, alors SI est ensuite
incrment, sinon il est dcrment.
Remarque : Possibilit dutiliser les prfixes de rptition, de mme que pour MOVSB.
d) linstruction STOSB ( Store String Byte )
Syntaxe : STOSB
Description : Stocke le contenu de AL dans loctet adress par ES:DI. Si DF = 0, alors DI est
ensuite incrment, sinon il est dcrment.
Remarque : Possibilit dutiliser les prfixes de rptition, de mme que pour LODSB.
e) linstruction CMPSB ( Compare String Byte )
Syntaxe : CMPSB
Description : Compare loctet adress par DS:SI et celui adress par ES:DI. Si DF = 0, alors
SI et DI sont ensuite incrments, sinon ils sont dcrments.

16

Remarque : Possibilit dutiliser les prfixes de rptition, de mme que pour SCASB.

12. Les instructions de gestion des chanes de mots


Ce sont les mmes que les prcdentes, hormis quelles traitent des mots et non des
octets et que leur nom se termine par un W au lieu du B.
a) linstruction MOVSW ( Move String Word )
Syntaxe : MOVSW
Description : Copie le mot adress par DS:SI ladresse ES:DI. Si DF = 0, alors DI et SI sont
ensuite incrments de 2, sinon ils sont dcrments de 2.
Remarque : Pour copier plusieurs mots, faire REP MOVSW. Le nombre de mots copier
doit tre transmis dans CX.
b) linstruction SCASW ( Scan String Word )
Syntaxe : SCASW
Description : Compare le mot adress par ES:DI avec AX. Les rsultats sont placs dans le
registre des indicateurs. Si DF = 0, alors DI est ensuite incrment de 2, sinon il est
dcrment de 2.
Remarque : Possibilit dutiliser les prfixes de rptition, de mme que pour SCASB.
c) linstruction LODSW ( Load String Word )
Syntaxe : LODSW
Description : Charge dans AX le mot adress par DS:SI. Si DF = 0, alors SI est ensuite
incrment de 2, sinon il est dcrment de 2.
Remarque : Possibilit dutiliser les prfixes de rptition, de mme que pour LODSB.
d) linstruction STOSW ( Store String Word )
Syntaxe : STOSW
Description : Stocke le contenu de AX dans le mot adress par ES:DI. Si DF = 0, alors DI est
ensuite incrment de 2, sinon il est dcrment de 2.
Remarque : Possibilit dutiliser les prfixes de rptition, de mme que pour STOSB.

17

e) linstruction CMPSW ( Compare String Word )


Syntaxe : CMPSW
Description : Compare le mot adress par DS:SI et celui adress par ES:DI. Si DF = 0, alors
SI et DI sont ensuite incrments de 2, sinon ils sont dcrments de 2.
Remarque : Possibilit dutiliser les prfixes de rptition, de mme que pour CMPSB.

13. Les instructions de gestion des chanes de doubles mots


Elles traitent des doubles mots et leur nom se termine par un D.
a) linstruction MOVSD ( Move String Double Word )
Syntaxe : MOVSD
Description : Copie le double mot adress par DS:SI ladresse ES:DI. Si DF = 0, alors DI et
SI sont ensuite incrments de 4, sinon ils sont dcrments de 4.
Remarque : Pour copier plusieurs doubles mots, faire REP MOVSD. Le nombre de doubles
mots copier doit tre transmis dans CX.
b) linstruction SCASD ( Scan String Double Word )
Syntaxe : SCASD
Description : Compare le double mot adress par ES:DI avec EAX. Les rsultats sont placs
dans le registre des indicateurs. 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 SCASB.
c) linstruction LODSD ( Load String Double Word )
Syntaxe : LODSD
Description : Charge dans EAX le double mot adress par DS:SI. Si DF = 0, alors SI est
ensuite incrment de 4, sinon il est dcrment de 4.
Remarque : Possibilit dutiliser les prfixes de rptition, de mme que pour LODSB.

d) linstruction STOSD ( Store String Double Word )


Syntaxe : STOSD
18

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.

14. Les instructions dappel


a) linstruction CALL ( Procedure Call )
Syntaxe : CALL MaProc
Description : Appel de procdure. Si MaProc se trouve dans un segment extrieur, le
processeur empile CS. Ensuite, dans tous les cas, il empile IP et fait un saut ltiquette
MaProc.
b) linstruction RET (ou RETN)
Syntaxe : RET
Description : Retour de procdure se trouvant lintrieur du segment (NEAR). Un mot est
dpil et plac dans IP. Le contrle retourne donc la procdure appelante.
c) linstruction RETF
Syntaxe : RETF
Description : Retour de procdure se trouvant lextrieur du segment (FAR). Deux mots sont
dpils et placs dans CS:IP. Le contrle retourne donc la procdure appelante.

15. Les instructions de boucle


a) linstruction LOOP

19

Syntaxe : LOOP MonLabel


Description : Dcrmente CX, puis, si CX <> 0, fait un saut MonLabel.
b) linstruction LOOPE ( Loop while Equal )
Syntaxe : LOOPE MonLabel
Description : Dcrmente CX, puis, si CX <> 0 et ZF = 1, fait un saut MonLabel.
Mnmonique quivalent : LOOPZ
c) linstruction LOOPNE ( Loop while not Equal )
Syntaxe : LOOPNE MonLabel
Description : Dcrmente CX, puis, si CX <> 0 et ZF = 0, fait un saut
MonLabel.

16. Les instructions dadressage


a) linstruction LEA ( Load effective address )
Syntaxe : LEA Destination, Source
Description : Charge loffset de la source dans le registre Destination.
Exemple : LEA BP, word ptr [BP + TOTO]
b) linstruction LDS ( Load pointer using DS )
Syntaxe : LDS Destination, Source
Description : Transfre dans DS:Destination le contenu de la mmoire adresse par Source.
c) linstruction LES ( Load pointer using ES )
Syntaxe : LES Destination, Source
Description : Transfre dans ES:Destination le contenu de la mmoire adresse par Source.

17. Les instructions de conversion arithmtique


Remarque prliminaire : Nous nexpliciterons pas toutes ces instructions.

20

a) linstruction AAA ( ASCII Adjust for Addition )


b) linstruction AAD ( ASCII Adjust for Division )
c) linstruction AAM ( ASCII Adjust for Multiplication )
d) linstruction AAS ( ASCII Adjust for Substraction )
e) linstruction CBW ( Convert Byte to Word )

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.

18. Les instructions dentre-sortie


a) linstruction IN ( Input from port )
Syntaxe : IN Destination, Port
Description : Charge un octet ou un mot depuis un port dentre-sortie dans AL ou AX. Port
peut tre DX ou bien une constante de 8 bits.
b) linstruction OUT ( Output to port )
21

Syntaxe : OUT Port, Source


Description : Ecrit dans Port la valeur contenue dans Source. Source ne peut tre que AL ou
AX. Port est une constante ou bien DX.

LECTURE ET ECRITURE DE FICHIERS AVEC LES HANDLES


Sous DOS, il existe deux mthodes pour accder aux fichiers et pour chacune d'elles un lot
d'interruptions spcifiques. La premire est la mthode des FCB ( File control block ). Elle
est rarement utilise, aussi ne l'aborderons nous pas. Nous tudierons le principe de la
mthode des handles .

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.

3. Ecriture dans un fichier


Pour crire des donnes, on procde de mme avec la fonction 40h. Les paramtres sont les
mmes que pour la fonction 3fh. Le buffer contient cette fois les octets crire. Aprs l'appel,
le nombre d'octets qui ont t effectivement crits est stock dans AX (il sera tre infrieur
la taille spcifie si le disque est plein).
23

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

- DS:DX : adresse d'une chane contenant


le chemin d'accs
- AL : mode d'accs

3eh

Fermer le fichier

- BX : handle

3fh

Lire le fichier

- BX : handle
- CX : nombre d'octets
- DS:DX : adresse d'un buffer

Ecrire dans le fichier

- BX : handle
- CX : nombre d'octets
- DS:DX : adresse d'un buffer

40h

24

II. LES FONCTIONS DE RECHERCHE DE FICHIERS


Pour rechercher un fichier (ou un dossier), on se sert des fonctions 4eh ( Find First ) et 4fh ( Find
Next ).
Imaginons par exemple que nous voulions chercher dans le dossier courant tous les fichiers qui portent
l'extension .com afin de les supprimer. Comment devons-nous nous y prendre ?
1. La fonction 4eh
La fonction 4eh sert dfinir des critres de recherche et trouver le premier fichier qui correspond ces
critres (s'il existe).
On doit passer dans DS:DX l'adresse de la chane de caractres qui contient le masque de recherche (dans
notre exemple, ce masque est *.com). Par dfaut, les fichiers sont cherchs dans le dossier courant. Mais
on peut videmment spcifier un autre chemin dans le masque.
Remarque importante : afin que le DOS puisse connatre sa taille, le masque doit imprativement tre
termin par l'octet 00h !
On crit galement dans CX les attributs des fichiers que l'on dsire trouver. Si CX vaut 0, seuls les fichiers
normaux pourront tre trouvs. En fait, chaque bit de CL reprsente un attribut, comme le montre le
tableau ci-dessous :
Bit

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

Lettre du lecteur (0=courant, 1=A, 2=B, ...) sur lequel se


trouve le fichier

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

Nom du fichier avec l'extension

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

Trouver le premier fichier qui correspond aux


caractristiques spcifies

- DS:DX : adresse d'une chane


contenant le masque
- CX : attributs

4fh

Trouver le prochain fichier

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

LES INTERRUPTIONS DU DOS RELATIVES AUX FICHIERS

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

Vous aimerez peut-être aussi