Vous êtes sur la page 1sur 31

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.

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 )

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

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 )

10

g) linstruction SHR ( Shift logical Right ) 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

11

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

12

Description : Met IF 0. 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.

13

b) linstruction POP ( Pop Word off Stack ) 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.

14

11. Les instructions de gestion des chanes doctets


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.

15

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

16

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

17

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

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.

18

d) linstruction STOSD ( Store String Double Word ) Syntaxe : STOSD 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.

19

15. Les instructions de boucle


a) linstruction LOOP 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.

20

17. Les instructions de conversion arithmtique


Remarque prliminaire : Nous nexpliciterons pas toutes ces instructions. 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

21

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

22

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 contol block ). Elle est rarement utilise, aussi ne l'aborderons nous pas. Nous tudierons le principe de la mthode des handles . 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.

23

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). 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 3dh 3eh 3fh Description Ouvrir le fichier Fermer le fichier Lire le fichier Paramtres - DS:DX : adresse d'une chane contenant le chemin d'accs - AL : mode d'accs - BX : handle - 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

Ecrire dans le fichier

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 1 2 3 4 5 6 7 8 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. Si au contraire la fonction a trouv un fichier, les caractristiques de ce fichier (i.e. son nom, sa taille, ses

25

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 00h 01h 0Ch 15h 16h 18h 1Ah 1Eh Description Lettre du lecteur (0=courant, 1=A, 2=B, ...) sur lequel se trouve le fichier Modle de la recherche Rserv Attributs du fichier Heure du fichier Date du fichier Taille du fichier Nom du fichier avec l'extension Taille (octets) 1 11 9 1 2 2 4 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 4eh 4fh Description Trouver le premier fichier qui correspond aux caractristiques spcifies Trouver le prochain fichier Paramtres - DS:DX : adresse d'une chane contenant le masque - CX : attributs 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

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

28

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 !

29

30

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 !

31