LE JEU D'INSTRUCTIONS Version imprimable Suggérer par mail
Appréciation des utilisateurs: / 0
FaibleMeilleur 

.1 Généralité

Une instruction en assembleur se traduit en une suite d'octets représentant le langage machine équivalent.

Cette suite d' octets a une longueur qui varie selon les instructions.

Comme nous l'avons déjà vu, le microprocesseur possède un registre particulier qu'est le registre de d'indicateurs ( flag ou drapeau). Ce registre est en fait composé de bits qui ont des significations différentes et qui sont modifiés (positionnés) selon l' exécution de certaines instructions.

Positionnement des indicateurs après exécution des instructions :

 

A

C

O

P

S

Z

Arithmétique

X

X

X

X

X

X

INC / DEC

X

?

X

X

X

X

Logique

?

O

O

X

X

X

Décalage

?

X

X

X

X

X

Rotation

?

X

X

?

?

?

X ! Positionné selon le résultat

O ! Mis à zéro

? ! Non modifié sauf si rapport avec le résultat

Positionnement des indicateurs à l'aide d'instructions :

 

1

0

Complément

Carry

STC

CLC

CMC

Direction

STD

CLD

 

Interupt Enable

STI

CLI

 

Ø CLI interdit les interruptions

Ø STI autorise les interruptions

4.2 Les instructions de base

4.2.1 L'identificateur

Une instruction peut être précédée d'un identificateur (de forme générale Ident:) qui représente l'adresse de stockage de cette instruction. On appelle cet identificateur une étiquette (label en anglais).

Debut: MOV AX, 00h

INC AX

JMP Debut

4.2.2 MOV

L'instruction de transfert de données se fait sur 8, 16 ou sur 32 bits.

Notes : reg = registre 8, 16 ou 32 bits

mem = adresse (ou identificateur)

imm = constante (valeur immédiate)

MOV reg, imm

MOV mem, imm

MOV reg, mem

MOV mem, reg

MOV reg, reg

Déplace l'opérande de droite dans l'opérande de gauche.

MOV AH, 00h

N'affecte pas les indicateurs.

Si un opérande est de type indéfini,

MOV [AX], 00h à MOV BYTE PTR [AX], 00h

ou

MOV WORD PTR [AX], 00h

4.3 Les instructions de pile

Une pile est une zone mémoire servant à stocker temporairement des valeurs. On ne peut stocker qu'une information à la fois et l'élément dépilé à un moment donné est celui qui a été empilé en dernier : c'est la structure LIFO (Last In, First Out). Les opérations ne se font que sur 16 bits.

La pile commence au segment SS et elle fini dans le même segment mais à l'offset SP. A notez que cette pile est remplie à l'envers : le premier élément est situé à une adresse plus haute que le dernier élément.

4.3.1 PUSH

Empile l'opérande. SP est décrémenté de 2.

PUSH reg

PUSH mem

4.3.2 POP

Dépile un élément et le copie dans l'opérande.

SP est incrémenté de 2.

POP reg

POP mem

Note : MOV DS, ES est interdit => PUSH ES et POP DS

4.3.3 PUSHA (PUSH All)

Empile tous les registres. Ne convient pas pour les registre 32 bits.

PUSHA

4.3.4 POPA (POP All)

Dépile tous les registres. Ne convient pas pour les registres 32 bits.

POPA

4.3.5 PUSHAD (PUSH All)

Même principe que PUSHA, mais empile aussi les registres 32 bits.

PUSHAD .

4.3.6 POPAD (POP All)

Même principe que POPA, mais dépile aussi les registres 32 bits.

POPAD

4.4 Les instructions sur le registre indicateur

4.4.1 PUSHF (PUSH Flag)

Permet de placer au sommet de la pile le contenu du registre indicateurs.

PUSHF

4.4.2 POPF (POP Flag)

Recopie le sommet de la pile dans le registre d'état.

POPF

4. 4. 3 LAHF (Load AH from Flag)

Cette instruction assure le transfert des indicateurs SF, ZF, AF et CF dans AH .

SF

ZF

 

AF

 

PF

 

CF

LAHF à AH :

4.4.4 SAHF (Store AH into Flag)

Cette instruction effectue le transfert de AH vers les indicateurs.

SAHF

4.5 Les instructions de transferts accumulateur

4. 5. 1 IN (INput from port)

Cette instruction transfert les données contenu dans le port spécifié dans AL, AX ou EAX. Si le numéro du port est inférieur à 256, alors l'adresse peu être mis tel que, sinon, il faut mettre l'adresse dans le registre DX.

IN AL, 42h

sinon

MOV DX, 123h

IN AX, DX

4. 5. 2 OUT (OUTput to port)

Comme l'instruction IN, OUT permet la lecture d' un port spécifié dans l'accumulateur AL, AX ou EAX. Si le numéro du port est inférieur à 256, alors l'adresse peu être mis tel que, sinon, il faut mettre l'adresse dans le registre DX.

OUT 8, AL

sinon

MOV DX, 126h

OUT DX, AX

4.5.3 XLAT

Cette instruction traduit un octet au moyen d'une table de transcodage.

Ø Le pointeur de début de table se trouve dans BX,

Ø L'accumulateur AL est utilisé comme index dans la table. L' opérande ainsi adressé est transféré dans AL.

MOV BX, offset TABLE

MOV AL, 2

XLAT

Remarques :

1) La table comportera au plus 256 valeurs,

2) L'utilisation de cette instruction est fréquente pour la ré affectation de caractères, et les transcodages binaire " ASCII.

4.6 Les instructions arithmétiques

4.6.1 L'addition

4.6.1.1 ADD

Cette instruction effectue une addition, le résultat est placé dans le premier opérande.

ADD reg,imm

ADD BX, 1

ADD AX, [BX + 2].

ADD mem,imm

ADD reg,mem

ADD mem,reg

ADD reg,reg

Flags modifiés : AF - CF - OF- SF - PF - ZF

Exemple :

MOV AX, 45h

ADD AX, 7

AX vaut maintenant 4Ch

4.6.1.2 ADC (Add with Carry)

Cette instruction effectue une addition( résultat placé dans le premier opérande), mais le résultat varie en fonction de CF, si CF= 0: le résultat est le résultat de l'addition, si CF= 1 le résultat est incrémenté de 1.

Flags modifiés : AF - CF - OF- SF - PF - ZF

Exemple :

CF= 1

AX = 45h

ADC AX, 2

AX vaut donc maintenant 48h

Si CF= 0, alors AX vaudrait 47h

4.6.1.3 INC (INCrement)

Cette instruction est en fait l'équivalant de "ADD ?, 1 ", cette instruction incrémente de1 l'opérande.

Flags modifiés : AF - OF - PF - SF - ZF

Exemple:

AX contient 18h ( 24 en décimal)

INC AX

AX contient 19h

 

4.6.2 La soustraction

4.6.2.1 SUB (SUBstract)

Cette instruction soustrait le deuxième opérande au premier.

Flags modifiés : AF - OF - PF - SF - ZF

Exemple :

AX contient 18h ( 24 en décimal)

SUB AX, 5

AX= 13

4.6.2.2 SBB (SUBstract with Below)

Cette instruction est en fait un dérivé de l'instruction SUB, elle fait aussi une soustraction, mais décrémente en plus de1 le résultat, si l'indicateur carry (CF) est égal à 1.

Flags modifiés : AF - OF - PF - SF - ZF

Exemple :

AX contient 18h ( 24 en décimal)

CF= 1

SBB AX, 5

AX= 12

4.6.2.3 DEC (DECrement)

Cette instruction fait l'équivalant de "SUB ?, 1 ", cette instruction décrémente donc de1 l'opérande.

Flags modifiés : AF - OF - PF - SF - ZF

Exemple :

AX contient 18h ( 24 en décimal)

DEC AX

AX contient 17h.Chapitre 4 Le jeu d'instructions

4.6.3 La multiplication

4.6.3.1 MUL (MULtiply)

Cette instruction sert à multiplier un nombre Non Signé par un nombre source. Il y a 3 cas différents :

Ø Si l'opérande source à une taille de un octet, AL est multiplié par la source, et le résultat dans AX,

Ø Si l'opérande source est un mot, le registre AX est multiplié par celui- ci, et le résultat placé dans le registre 32 bits : DX+ AX,

Ø Si l'opérande source est un double, le registre EAX est multiplié par l'opérande source, le résultat placé dans le registre 64 bits :

EDX+ EAX.

Flags modifiés : CF - OF

Exemple :

AX contient 9

BL contient 3

MUL BL

AX contient 27

4.6.3.2 IMUL (signed Integer MULtiply)

Cette instruction a la même fonction que l'instruction MUL ci- dessus mais elle supporte les nombres signés.

Flags modifiés : CF - OF

Exemple :

Voir MUL

4.6.4 La division

4.6.4.1 DIV (DIVise)

Cette instruction sert à diviser un nombre Non Signé par un nombre source; il y a 3 cas différents :

Ø Si l'opérande source a une taille de un octet, AX est divisé par celui- ci, le quotient dans AL et le reste dans AH,

Ø Si l'opérande source est un mot, le nombre 32 bits (DX+ AX) est divisé par celui- ci, le quotient dans AX et le reste dans DX,

Ø Si l'opérande source est un double, le nombre 64 bits (EDX+ EAX) est divisé par l'opérande source, le quotient dans EAX et le reste dans EDX.

Flags modifiés : Aucun

Exemple :

AX contient 18

BL contient 3

DIV BL

AX contient 9

4.6.4.2 IDIV (signed Integer DIVision)

Cette instruction a la même fonction que l'instruction DIV ci- dessus mais elle supporte les nombres signés.

Flags modifiés : Aucun

Exemple :

Voir DIV

4.6.4.3 CMP (CoMPare)

Cette instruction compare deux opérandes; pour cela cette instruction soustrait les deux opérandes. Le résultat de la soustraction n'est pas Sauvé, seuls les indicateurs sont modifiés.

Flags modifiés : AF - CF - OF - PF - SF - ZF

Exemple :

CMP AX, 7

JNZ Suite ;Si AX =/= 7 va à suite

4. 6. 5 Ajustement de données

4.6.5.1 AAA (Ascii Adjust for Addition)

Il faut utiliser cette instruction après avoir effectué une addition, cette instruction va corriger le contenu du registre AL, pour que l'addition soit juste.

Flags modifiés : AF - CF

Exemple :

AX contient la valeur 19, on veut addition 3 au registre AX:

AX = 0109h

ADD AX, 3

AX devient 010Ch, or on veut additionner 3 au nombre ASCII 19;on utilise donc AAA:

AAA

AX va être ajusté et va maintenant contenir 0202h

4.6.5.2 AAS (Ascii Adjust for Subtraction)

Cette instruction corrige le résultat après une soustraction de nombres non

compactés.

Flags modifiés : AF - CF

Exemple :

Voir AAA

4.6.5.3 AAM (Ascii Adjust for Multiplication)

Cette instruction corrige le résultat après une multiplication de nombres non compactés.

Flags modifiés : PF - SF - ZF

Exemple :

AL contient la valeur 3, on veut multiplier AL par 9

AL= 0003h

BL= 0009h

MUL BL

AX contient maintenant 001Bh . (27 en décimal)

AAM

AL contient 0207h

4.6.5.4 AAD (Ascii Adjust for Division)

Cette instruction doit être utilisée avant de faire une division de nombre décimaux non compactés dans un registre. Cette procédure va en fait multiplier le contenu de AH par 10, et additionner le résultat à AL; AH est remis ensuite à 0.

Flags modifiés : SF - ZF - PF

Exemple :

AX contient la valeur 19.

AX = 0109h

AAD

AX contient maintenant 0013h.

4.6.6 Conversion de type

4.6.6.1 CBW (Convert Byte to Word)

Cette instruction convertit le registre AL, en registre AX. Cette instruction travaille

aussi avec des nombre signés.

Flags modifiés : Aucun.

Exemples :

AL= 1Eh (soit 30)

AH=? le contenu de AH, n'est pas important.

CBW

AX vaut maintenant 001Eh (30)

Si AL = E2h (- 30)

CBW

AX vaut maintenant FFE2h (- 30)

4. 6. 6. 2 CWD (Convert Word to Doubleword)

Cette instruction est du même type que CBW, mais convertit un Mot en Double Mot. Le résultat est placé dans AX et DX. Travaille aussi avec des nombres signés.

Flags modifiés : Aucun

Exemples :

AX = 1234h (4460en décimal)

DX= ?

CWD

AX= 1234h

DX= 0000h

De même :

AX= EDCCh(- 4460 décimal)

CWD

AX inchangé

DX= FFFFh

4. 6. 6. 3 CWDE (Convert Word to Extended Doubleword)

Cette instruction est presque la même que celle ci- dessus, mais le résultat est placé dans EAX au lieu d'être placé dans AX et DX.

Flags modifiés : Aucun

Exemples :

EAX=???? 1324h

CWDE

EAX= 00001234h

De même :

EAX=???? EDCCh(- 4460 décimal)

CWDE

EAX= FFFFEDCCh

4. 6. 6. 4 CDQ (Convert Doubleword to Quadword )

Cette instruction convertit le registre EAX, en registre 64 bits (EAX+ EDX). Cette instruction travaille aussi avec des nombres signés.

Flags modifiés : Aucun

Exemples :

EAX= 12345678h (soit 305419896)

CDQ

EAX vaut maintenant 12345678h

EDX vaut maintenant 00000000h

Si EAX = EDCBA988h (- 305419896)

CDQ

EAX est inchangé

EDX = FFFFFFFFh.

4.6.6.5 NEG (NEGation)

Cette instruction va tout simplement inverser le contenu d'un registre ou d'une adresse mémoire. Pour cela, elle inverse d'abord tous les bit, et ajoute 1.

Flags modifiés : AF - OF - PF - SF - ZF

Exemple :

AX contient 1234h (soit 4660)

AX= 0001 0010 0011 0100

NEG AX

AX= 1110 1101 1100 1011 +0000 0000 0000 0001

AX= 1110 1101 1100 1100

AX= FFFFEDCCh Soit (- 4660)

4.7 Les instructions logiques

4.7.1 AND (ET logique)

Cette instruction est l'équivalant d'une porte ET logique, elle réalise un ET entre 2 opérandes. Le résultat est placé dans le premier opérande.

Flags modifiés : CF - OF - PF - SF - ZF

Exemple :

On effectue un ET entre AH (9Dh) et BH (6Dh)

AH= 1001 1101

BH= 0110 1101

AND AH, BH

AH= 0000 1101 (0Dh)

4.7.2 OR (OU logique)

Encore une autre porte logique, cette porte effectue un OU entre deux opérandes.

Flags modifiés : CF - OF - PF - SF - ZF

Exemple :

On effectue un OU entre AH (9Dh) et BH (6Dh)

AH= 1001 1101

BH= 0110 1101

OR AH, BH

AH= 1111 1101 (FDh)

 

4.7.3 XOR (OU eXclusif)

Cette instruction effectue un OU exclusif.

Flags modifiés : CF - OF - PF - SF - ZF

Exemple :

On effectue un XOR entre AH (9Dh) et BH (6Dh)

AH= 1001 1101

BH= 0110 1101

XOR AH, BH

AH= 1111 0000 (F0h)

4. 7. 4 TEST (TEST for bit pattern)

Cette instruction va effectuer un ET logique, mais le résultat ne sera pas gardé; seul les indicateurs seront modifiés

Flags modifiés : CF - OF - PF - SF - ZF

4.7.5 NOT

C'est l'équivalent de la porte logique NON, le principe de cette porte est simple, inverser tous les bits.

Flags modifiés : Aucun

Exemple :

AX= 1001 1101 1110 0110 (9DE6h)

NOT AX

AX= 0110 0010 0001 1001 (6219h)

4.8 Les instructions de décalages et de rotations

En mode immédiat, seuls les décalages et rotations de 1 bit peuvent se réaliser. Pour réaliser des décalages ou rotations de plusieurs bits, il faut explicitement utiliser le registre CL.

4.8.1 SHR (SHift Right)

Décale à droite de x positions, x contenu dans le deuxième opérande, les bits entrant sont mis à 0 (on ne fait pas attention au signe, contrairement à SAR), les bits sortant sont placés successivement dans CF, sans conservation, celui- ci prend donc la valeur du dernier bit sorti.

Flags modifiés : CF - OF - PF - SF - ZF

Exemple :

On va décaler le registre AH de 5 positions.

AH =1011 0111

SHR AH, 5

AH= 00000101

4. 8. 2 SHL (SHift Left)

Effectue un décalage des bits du premier opérande, les bits sortant sont insérés dans CF, les bits entrant sont mis à 0.

Flags modifiés : CF - OF - PF - SF - ZF

Exemple :

On va décaler le registre AH de 5 positions.

AH =1011 0111

SHL AH, 5

AH= 1110 0000

4.8.3 SAR (Shift Arithmetic Right)

Cette instruction effectue un décalage vers la droite, le nombre de positions à décaler est inscrit dans le second opérande. Le bit sortant est mis dans CF, et le bit rentrant varie en fonction du signe du nombre au départ; si au départ le nombre était positif, tous les bit entrant seront de 0, sinon, l'inverse. Comme le carry (CF) prend successivement les valeurs des bits sortant, après cette instruction CF est égal au dernier bit sorti.

Flags modifiés : CF - OF - PF - SF - ZF

Exemple :

On va décaler le registre AH de 5 positions vers la droite.

AH = 0101 1100 (92d)

SAR AH, 4

AH= 0000 0101

CF= 1

4.8.4 SAL (Shift Arithmetic Left)

Cette instruction est identique à SHL.

4.8.5 ROR (ROtate Right)

A peu près le même style que les instructions précédentes, les bits sont décalés vers la droite, mais, cette fois, le bit sortant est injecté à dans CF et dans le bit de poids fort.

Flags modifiés : CF - OF

Exemple :

On va décaler le registre AH de 5 positions vers la droite.

AH =1011 0111

ROR AH, 5

AH= 0111 1101

4.8.6 ROL (ROtate Left)

Idem ROR, mais décale sur la gauche.

Flags modifiés : CF - OF

Exemple :

On va décaler le registre AH de 5 positions vers la gauche.

AH =1011 0111

ROL AH, 5

AH= 1111 0110

4.8.7 RCR (Rotate trought Cary Right)

Cette instruction agit sur les bits de l'opérande, elle les décale de x vers la droite. Le bit contenu dans CF prend la position du bit le plus fort, puis CF prend la valeur du bit sortant. X est la valeur contenu dans le deuxième opérande.

Flags modifiés : CF - OF

Exemple :

On va décaler le registre AH de 5 positions.

On sait que CF= 0

AH =1011 0111

RCR AH, 5

AH= 01110101

CF= 1

4. 8. 8 RCL (Rotate trought Cary Left)

Idem RCR, mais déplace les bits vers la gauche.

Flags modifiés : CF - OF

Exemple :

On va décaler le registre AH de 5 positions.

On sait que CF= 1

AH =1011 0111

RCL AH, 5

AH= 1111 1011

CF= 0

4.9 Ruptures de séquence

4. 9. 1 Les branchements inconditionnels

4.9.1.1 JMP (JUmP)

Cette instruction effectue un saut sans condition. Le saut peut être sur un label, une adresse mémoire, ou un registre (adressage direct ou basé).

Flags modifiés : Aucun

Exemple :

JMP label1

XORAX, AX

Label1:

XOR est sauté.

4.9.1.2 INT (INTerrupt)

C'est assez simple, une interruption est un genre de sous programme contenu dans le BIOS ou dans votre système d'exploitation. Les interruptions vous facilite la tache, mais des fois, il vaut mieux éviter de les utiliser.

Je m'explique : Il existe par exemple une interruption qui permet d'afficher un pixel à l'écran, en 320* 200, le problème, c'est que ca va très lentement, surtout si on l'appelle 64000 fois!!! Pour ce cas, il existe donc un autre moyen, chaque pixel de l'écran est représenté dans une partie de lamémoire, et il suffit donc de mettre la couleur du pixel à l'adresse ou l'on veut pour afficher un pixel.

La plupart du temps, il vous faudra modifier les registres pour lancer un interruption.

Flags modifiés : TF - IF

Exemple :

MOV AH, 09h

INT 21h

Fonction MS- DOS; Ecrit un message.

MOV AH, 00h

MOV AL, 13h

INT 10h

Fonction BIOS; Charge le mode VGA 256 couleur 320* 200.

4. 9. 2 Les branchements conditionnels

Ces instructions permettent de sauter "une partie d'un programme" si une condition est vérifiée. Elle est très pratique, on peut par exemple écrire de petit programmes du type basic "if... then .... else". Toutefois si les conditions ne sont pas vérifiées, le programme saute cette instruction et suit son cours normal.

Toutes ces instructions ont la forme générale suivante : J… inden t, où « J… » est le mnémonique de l' instruction et « ident » est un label qui doit se trouver dans un intervalle de –127 à 128 autour de l'instruction.

4.9.2.1 Les tests d'indicateurs

Instruction

Condition

Définition

JZ

ZF = 1

Jump if Zero

JE

Jump if Equal

JNZ

ZF = 0

Jump if Not Zero

JNE

Jump if Not Equal

JC

CF = 1

Jump if Carry

JNC

CF = 0

Jump if Not Carry

JS

SF = 1

Jump if Sign

JNS

SF = 0

Jump if Not Sign

JO

OF = 1

Jump if Overflow

JNO

OF = 0

Jump if Not Overflow

4. 9. 2. 2 Les test de nombres non signés

Instruction

Condition

Indicateurs

Definition

JA

A > B

CF = 0 et ZF = 0

Jump if Above

JNBE

Jump if Not Below or Equal

JAE

A >= B

CF = 0

Jump if Above or Equal

JNB

Jump if Not Below

JNC

Jump if Not Carry

JBE

A <= B

(CF = 1 et ZF = 1) ou (CF <> ZF)

Jump if Below or Equal

JNA

Jump if Not Above

JB

A < B

CF = 1

Jump if Below

JC

Jump if Carry

JNAE

Jump if Not Above or Equal

JE

A = B

ZF = 1

Jump if Equal

JZ

Jump if Zero

JNE

A <> B

ZF = 0

Jump if Not Equal

JNZ

Jump if Not Zero

Exemple :

MOV AH, 0FFh

CMP AH, 0 ;compare FFh avec 0

JB suite ;test NON signé (saut si AH < 0)

Suite :

L'instruction JB ne provoquera pas le branchement au label SUITE car 255 est supérieur à 0 car comme le test est non signé,FFh vaut 255.

4.9.2.3 Les tests de nombres signés

Instruction

Condition

Indicateurs

Définition

JG

A > B

ZF = 0 et OF = SF

Jump if Greater

JNLE

Jump if Not Lower or Equal

JGE

A >= B

SF = OF

Jump if Greater or Equal

JNL

Jump if Not Lower

JNG

A <= B

(ZF = 1) ou

(SF <> OF)

Jump if Not Greater

JLE

Jump if Lower or Equal

JNGE

A < B

SF <> OF

Jump if Not Greater or Equal

JL

Jump if Lower

JE

“”

A = B

“”

ZF = 1

Jump if Equal

JZ

Jump if Zero

JNE

A <> B

ZF = 0

Jump if Not Equal

JNZ

Jump if Not Zero

Exemple :

MOV AH, 0FFh

CMP AH, 0 ;compare FFh avec 0

JL suite ;test signé (saut si AH < 0)

Suite :

L'instruction JL provoquera le branchement au label SUITE car –1 est inférieur à 0 car comme le test est signé, FFh est égal à –1.

4. 9. 3 Les boucles

4.9.3.1 LOOP

Cette instruction effectue une répétition tant que CX n'est pas égal à zéro; elle ci décrémente CX de 1 à chaque saut. Elle est l'équivalent de :

Label1: DEC CX

CMP CX, 0

JNE Label1

Flags modifiés : Aucun

Exemple :

MOV CX, 10

Boucle_ principale:

Loop Boucle_ principale

4.9.3.2 LOOPE (LOOP while Equal)

Cette instruction à la même fonction que l'instruction LOOP, elle décrémente de 1 CX, et compare CX avec 0, si ce n'est pas égale, elle saute au label spécifié, mais, de plus, elle saute au label que si l'indicateur ZF est égal a 1, donc si la dernière opération effectué a positionné cet indicateur.

Flags modifiés : Aucun

Exemple :

Recherche d' un premier élément non nul

MOV CX, LENGTH

MOV SI, -1

Suiv : INC SI

CMP TABLE[ SI], 0

LOOPE Suiv

CMP CX, 0

JNE Trouve

PasTrouve :

Trouve :

4.9.3.3 LOOPNE

Cette instruction décrémente CX et effectue un saut à l'adresse si CX <> 0 et ZF = 0.

Flags modifiés : Aucun

Exemple : Voir LOOPE.

4. 9. 4 Les appels ou retours de sous- programmes

4.9.4.1 PROC (PROCedure)

Voir ENDP.

4.9.4.2 ENDP (END Procedure)

L'instruction PROC signale a l'assembleur le début d'un sous- programme et ENDP signale la fin des instructions du sous programme.

Les formes disponibles de ces instructions sont :

nomdeproc PROC NEAR

nomdeproc PROC FAR

nomdeproc ENDP

où « nomdeproc » est un identificateur représentant le nom que le programmeur donne au sous- programme.

Flags modifiés : Aucun

Exemple :

LireCar PROC NEAR ;marque le début du sous- programme

MOV AH, 0 ; AH # service 0

INT 16h ; AL # caractère lu

RET

LireCar ENDP ;marque la fin du sous- programme

4.9.4.3 CALL

En assembleur, on peu faire des sous- programmes (on est obligé, si onveux de la clarté, et si on veux alléger son programme). Cette instruction sert donc à "appeler", comme son nom l'indique, un sous- programme. Un peu plus technique, cette instruction va sauvegarder l'IP (Instruction Pointer), et va remplacer celui- ci par l'adresse du sous –programme (Proc). Le programme reprends sont cours à la fin du sous- programme.

Flags modifiés: Aucun

Exemple:

WriteMsg:

PUSH AX

MOV AX, 09h

INT 21h

POP AX

RET

start:

MOV DX, Offset Message

CALL WriteMsg

Remarque : Les sous- programme modifient souvent les registres, alors prenez l'habitude d'utiliser PUSH et POP .

4.9.4.4 RET (RETurn)

Je vous parle de sous- programme, et bien cette instruction sert à terminer un sous programme, puis le programme reprends son cours normal, d'un point de vu technique, l'adresse de l'instruction est récupérée et placée dans IP.

Flags modifiés : Aucun

Exemple : Voir Call

4.9.4.5 IRET (Interrupt RETurn)

Marque la fin d'une interruption en récupérant IP, CS et les Flags puis continu l'exécution du programme à l'adresse récupérée.

Flags modifiés : AF- CF- DF- OF- SF- TF- ZF

4.10 Les opérations sur les chaînes

 

4.10.1 CLD (CLear Direction flag)

Cette instruction permet de positionner l'indicateur DF à 0 Flags modifiés : DF.

4.10.2 STD (STore Direction flag)

Cette instruction permet de positionner l'indicateur DF à 1

Flags modifiés : DF

4.10.3 MOVSB (MOVe String Byte)

Déplace un octet de l'adresse DS: SI à l'adresse ES: DI, SI et DI sont ensuite incrémenté de 1 (si DF= 0) ou décrémenté de 1 (si DF= 1).

Flags modifiés : Aucun

Exemple :

Msg1 DB 'Salut'

Msg2 DB ?

MOV SI, OFFSET Msg1

MOV DI, OFFSET Msg2

MOVSB

Msg2 est maintenant égal à 'S'

Note :Voir instruction REP pour "améliorer" cette instruction.

4.10.4 MOVSW (MOVe String Word)

Déplace un mot de l'adresse DS: SI à l'adresse ES: DI, SI et DI sont ensuite incrémenté de 2 (si DF= 0) ou décrémenté de 4 (si DF= 1).

Flags modifiés : Aucun

Exemple : Voir MOVSB

 

4. 10. 5 MOVSD (MOVe String Double)

Déplace un mot de l'adresse DS: SI à l'adresse ES: DI, SI et DI sont ensuiteincrémenté de 4 (si DF= 0) ou décrémenté de 4 (si DF= 1).

Flags modifiés : Aucun

Exemple : Voir MOVSB

 

4.10.6 LODSB (LOaD String Byte)

Cette instruction transfère le contenu de DS: SI dans AL, puis SI est incrémenté de 1 si DF= 0, ou décrémenté de 1 si DF= 1.

Flags modifiés : Aucun

Exemple :

Valeur DB 69h

Valeur2DB 70h

MOV AX, 0000h

CLD

MOV SI, OFFSET Valeur

LODSB

(AX= 0069h)

(SI pointe maintenant sur Valeur2( SI+ 1)

LODSB

(AX= 0070h)

Voir instruction REP pour "améliorer" cette instruction.

4.10.7 LODSW (LOaD String Word)

Cette instruction transfère le contenu de DS: SI dans AX, puis SI est ncrémenté de 2 si DF= 0, ou décrémenté de 2 si DF= 1.

Flags modifiés : Aucun

Exemple : Voir LODSB.

4. 10. 8 LODSD (LOaD String Double)

Cette instruction transfère le contenu de DS: SI dans EAX, puis SI est ncrémenté de 4 si DF= 0, ou décrémenté de 4 si DF= 1.

Flags modifiés : Aucun

Exemple : Voir LODSB.

 

4.10.9 CMPSB (CoMPare String Byte)

Voir CMPSD.

 

4.10.10 CMPSW (CoMPare String Word)

Voir CMPSD.

4. 10. 11 CMPSD (CoMPare String Double)

Ces instructions comparent le contenu de l'adresse DS: SI ,et le contenu ui se trouve à ES: DI , on peut comparer un octet, un Mot ou un Double ot. De plus, cette instruction incrémente ou décrémente SI et DI, suivant a valeur de DF (DF= 0, SI et DI incrémenté; DF= 1 SI et DI décrémenté). Si n utilise CMPSB, incrément/ décrément de 1, CMPSW, de 2 ,et CMPSD de 4.

Flags modifiés : AF - CF - OF - PF - SF - ZF

Exemple :

SI= 1234h

DI= 4567h

CMPSW

SI= 1236h

DI= 4569h

 

4.10.12 STOSB (STOre String Byte)

Copie les données placés dans AL vers l'octet pointé par ES: DI. Le Registre DI est ensuite incrémenté de 1 si DF= 0, et décrémenté de 1 si DF= 1.

Flags modifiés : Aucun

Exemple :

Msg1 DB ?

MOV DI, OFFSET Msg1

MOV AL, 0

STOSB

Msg1 contient maintenant le message ‘0'

4.10.13 STOSW (STOre String Word)

Copie les données placés dans AX vers le mot pointé par ES: DI. Le Registre DI est ensuite incrémenté de 2 si DF= 0, et décrémenté de 2 si DF= 1.

Flags modifiés : Aucun

Exemple : Voir STOSB.

4. 10. 14 STOSD (STOre String Double)

Copie les données placés dans EAX vers le double pointé par ES: DI. Le Registre DI est ensuite incrémenté de 4 si DF= 0, et décrémenté de 4 si DF= 1.

Flags modifiés : Aucun

Exemple : Voir STOSB.

 

4.10.15 REP (REPeat)

Cette instruction est le gros avantage des instructions ci- dessus, l'opérande de cette instructions est une instruction. Le processeur effectue cette instructions, et décrémente le registre CX, jusqu'à ce que celui- ci soit nul. Il faut donc placé préalablement le "nombre de fois à répéter l'instruction dans le registre CX".

Flags modifiés: Aucun

Exemple :

Msg1 DB 'Salut'

Msg2 DB ?

MOV SI, OFFSET Msg1

MOV DI, OFFSET Msg2

MOV CX, 5

REP MOVSB

La chaîne Msg1 est maintenant identique à la chaîne Msg2.

Remarque : Cette instruction est utilisable qu'avec les instruction de manipulation de caractères.

4.10.16 REPE (REPeat while Equal)

Dérivé de l'instruction REP, cette instruction continu la répétition tant que CX n'est pas nul, ou tant que le contenu de ES:[ DI] et le contenu de DS:[ SI] sont identiques. Cette instruction est très intéressante pour comparer si deux chaînes sont identiques.

Flags modifiés : Aucun

Exemple :

Msg1 DB 'Salut'

Msg2 DB 'Salue'

MOV SI, OFFSET Msg1

MOV DI, OFFSET Msg2

MOV CX, 5

REPE MOVSB

La répétition s'arrêtera au dernier caractère (" t" et "e" sont différent). On peut donc voir le nombre de caractères identiques en regardant l'état de CX, qui est décrémenté comme avec l'instruction REP.

 

4.10.17 REPNE (REPeat while Not Equal)

Toujours un dérivé de REP, mais cette fois, contrairement à REPE, au lieu que la répétition s'arrête quand deux caractères sont différents, la répétition s'arrête quand deux caractères sont identiques.

Flags modifiés : Aucun

Exemple : Voir REPE.

 

4.10.18 REPZ (REPeat while Zero)

Identique à REPE.

 

4.10.19 REPNZ (REPeat while Not Zero)

Identique à REPNE.

4.10.20 SCASB (SCAn String Byte)

Compare l'octet pointé par ES: DI, avec le registre 8 bits AL. Le Registre DI est ensuite incrémenté de 1.

Flags modifiés : AF - CF - OF - PF- SF - ZF

Exemple :

Msg1 DB 'Salut'

MOV DI, OFFSET Msg1

MOV AL, 'l'

REPNE SCASB

La répétition s'arrêtera au 3ème caractères, le caractère l.

 

4.10.21 SCASW (SCAn String Word)

Compare le mot pointé par ES: DI, avec le registre 16 bits AX. Le Registre DI est ensuite incrémenté de 2.

Flags modifiés : AF - CF - OF - PF- SF - ZF

Exemple : Voir SCASB.

4. 10. 22 SCASD (SCAn String Double)

Compare le double pointé par ES: DI, avec le registre 32 bits EAX. Le

Registre DI est ensuite incrémenté de 4.

Flags modifiés : AF - CF - OF - PF- SF - ZF

Exemple : Voir SCASB.

4.11 Les instructions de gestion des adresses

4.11.1 LEA (Load Effective Address)

Cette instruction transfère l'adresse d'Offset de la source dans le registre de destination. (c'est donc l'équivalent de MOV REG, OFFSET source ), pour des registres de type index ou base.

Flags modifiés : Aucun

Exemple :

LEA SI, Table " MOV SI, OFFSET TABLE

4.11.2 LES (Load Extra Segment)

Charge une adresse 32 bits dans le couple de registres constitué de ES: Registre :

ES à contient le segment

Registre à contient l' offset

Flags modifiés : Aucun

Exemple :

LES SI, Pointeur

4. 11. 3 LDS (Load Data Segment)

Charge une adresse 32 bits dans le couple de registres constitué de DS: Registre :

DS à contient le segment

Registre à contient l' offset

Flags modifiés : Aucun

Exemple :

LDS DI, Pointeur

4.12 Déclaration de données

4.12.1 DB (Define Byte)

Cette instruction sert à définir un octet, ainsi vous pouvez définir un nombre inférieur à 255, une chaîne de caractères, ...

Flags modifiés : Aucun

Exemple :

Mess1 DB 'Salut à toi', '$ '

Nbr1 DB 69

ColorScr DB ?

La premier label contient la chaîne de caractère « salut à toi$ », le second le nombre décimal 69, et le dernier contient un nombre indéfini, on s'en servira dans le programme pour remplacer ce nombre par un nombre connu.

 

4.12.2 DW (Define Word)

Cette instruction définit un mot, donc une valeur inférieur ou égale à65535.

Flags modifiés : Aucun

Exemple : Voir DB.

 

4. 12. 3 DD (Define Double)

Cette instruction définit un double mot (32 bits).

Flags modifiés : Aucun

Exemple : Voir DB.

 

4.12.4 DQ (Define Quadword)

Cette instruction définit un quadruple mot (64 bits).

Flags modifiés : Aucun

Exemple : Voir DB.

 

4.12.5 EQU (EQUivalent)

Cette instruction affecte un nombre à un label. La valeur ne peut pas être

modifiée : c'est une déclaration de constante.

Flags modifiés : Aucun

Exemple :

KbEsc EQU 283.

 

Commentaires (0)Add Comment

Ecrivez un commentaire
quote
bold
italicize
underline
strike
url
image
quote
quote
smile
wink
laugh
grin
angry
sad
shocked
cool
tongue
kiss
cry
Réduire l'éditeur | Agrandir l'éditeur

security code
Entrez les caractères affichés


busy
 
< Précédent   Suivant >

Vidéos aléatoires

cosinus d´un angle
Moyenne:
Clics:60
FONCTION AFFINE ET GEOMETRIE
Moyenne:
Clics:202
Les Marees
Moyenne:
Clics:34
Maths - Equation d´une droite (Niveau : Troisième / Seconde)
Moyenne:
Clics:354

Liens

Liens

Syndication

Qui est en ligne

Il y a actuellement 1 invité en ligne

Identification






Mot de passe oublié ?
Pas encore de compte ? Enregistrez-vous