Vous êtes sur la page 1sur 13

Chapitre V : Les Instructions

GENERALITES

Un programme en Assembleur est composé d’instructions

Une Instruction comporte au plus 4 champs


- L’Etiquette (Label) , permet de repérer l’instruction
- Le Mnemonique, identifie l’instruction
- Les opérandes, complètent l’instruction
- Le commentaire commente l’instruction (facultatif)

Pour maintenir la clarté du programme on prendra l’habitude de créer 4 colonnes

Exemples :

LABEL INSTRUCTION OPERANDES COMMENTAIRES

Début : MOV AX, BX ; AX ← BX


ADD AX , BX ; Additionne le contenu
; de AX et BX et charge
; le Résultat dans AX
JMP Début ; force le Microprocesseur
; à retourner au label « Début »

Il existe 4 catégories d’instructions


- Les Instructions de base
- Les Instructions logiques et arithmétiques
- Les Instructions de Rupture de séquence
- Les Instructions de Gestion des adresses

Lorsqu’il y a 2 opérandes dans une instruction l’opérande de gauche est la Destination


Les opérations effectuées par le Microprocesseur pour exécuter un programme sont les
suivants :

1- Le Registre IP contient le déplacement du premier byte de l’instruction à exécuter


L’adresse complète est CS : IP
Ce byte est lu et décodé pour savoir à quelle instruction il correspond
Le registre IP est ensuite incrémenté pour « pointer »
- Soit sur les autres bytes de l’instruction courante
- Soit sur l’instruction suivante

2- L’instruction est exécutée

V-1 Les Instructions de base

- L’instruction MOV

C’est une instruction de transfert de données


Le contenu de l’opérande de Droite est transféré dans l’opérande de Gauche

MOV Reg, imm


MOV mem, imm
MOV Reg, mem
MOV mem, Reg
MOV Reg, Reg

Reg est un Registre (sauf un registre de segment)


mem est une adresse (ou un identificateur)
imm est une valeur immédiate (constante)
Exemples :

MOV AH,12 ; AH 12 , AL n’est pas affecté


MOV BX,1 ; BX1 , BL et BH sont affectés
Id1 DB ? ; Definition d’une variable BYTE
Id2 DW ? ; definition d’une variable WORD
MOV Id1,12 ; Id1 ← 12, opération sur 1 BYTE
MOV Id2, 1 ; Id2←1 , opération sur 1 MOT
MOV AX, BX ; AX ← BX , 16 bits
MOV AH, BL ; AH ← BL , 8bits

Les Instructions de transfert de données n’affectent pas les indicateurs du Registre FLAG

V-2 Les Instructions de Pile

La Pile est une structure (Zone Mémoire) qui sert à sauver temporairement des informations

Méthode LIFO (Last IN, First OUT ) = ( le dernier empilé sera le premier desempilé )

Les Instructions PUSH et POP

-Lorsqu’une instruction PUSH est rencontrée , le registre SP (Stack Pointer) est d’abord
decrementé de 2 ( un élement = 2 bytes) et le contenu du registre spécifié est copié dans
l’element numero SP de la PILE ( adresse SS :SP )

-Pour une operation POP , l’element numero SP de la liste est copié dans le registre specifié
et SP est incrementé de 2

PUSH reg

POP reg
reg est un Registre de 16 bits
mem est une zone Mémoire de 16 bits

EXEMPLE :

Pile de 50 Eléments vides :


100 SP - SP « pointe » avant la pile
98 1er Element (vide)
96 2ème Elément (vide)
94 3ème Elément (vide)
..
..

Si on exécute les instructions suivantes :

MOV AX, 1 ; AX reçoit la valeur 1


MOV BX, 2 ; BX reçoit la valeur 2
PUSH AX ; empile AX
PUSH BX ; empile BX

On aura
100
98 1 1er Elément (rempli)
96 SP  2 2e Elément (rempli)
94 3e Elément (vide)

Si on exécute maintenant les instructions

MOV BX,3 ; BX reçoit la valeur 3 , BX 3


POP BX ; BX reçoit le contenu du dernier élément de Stack Pointer (SP) (=2)
qui écrase la valeur 3 , BX2

Le Stack a alors l’allure suivante :


100
98 SP 1 1er Elément (rempli)
96 2e Elément ( vide)
94 3e Elément (vide)

NB : La Pile pourra être utilisée pour effectuer des opérations de transfert qui ne sont pas
autorisées

Ex :
MOV DS, ES ; Transfert non autorisé entre Registre de Segment

Mais on pourra alors procéder comme suit

PUSH ES ; met la valeur de ES sur la pile


POP DS ; récupère cette valeur dans DS

Les instructions PUSHF et POPF

Pour empiler ou désempiler le Registre FLAG


(ces instructions ne possèdent aucune opérande)

EX 1 :
Modifier la valeur du registre FLAG

MOV AX, 16 ; AX 16


PUSH AX ; Empile AX
POPF ; récupère AX dans le registre FLAG

EX 2 :
Si on souhaite effectuer une opération arithmétique mais on ne souhaite pas que les
indicateurs soient affectés

PUSHF ; Sauvegarde des indicateurs (FLAG)


MOV AX, 2 ; AX 2
ADD AX , 3 ; AX  A X + 3 et cette opération arithmétique va
modifier la valeur des indicateurs FLAG
POPF ; Récupère les indicateur d’origine
NB : Les instructions PUSH , PUSHF et POP n’affectent pas les Indicateurs FLAG
Mais POPF affecte tous les indicateurs FLAG

V-3 Les instructions de manipulation de Chaines

Le traitement des chaines de caractères est particulièrement important

Dans les opérations, ils interviendront toujours 2 zones Mémoires :


« Chaine Source » et « Chaine Destination »
-La chaine Source doit toujours se trouver dans un Segment DS et Offset SI
-La chaine Destination dans le Segment ES et Offset DI

Exemple :

Texte1 DB ‘ Ceci est un texte….’


Texte2 DB ‘ Voici un autre texte …’
Texte3 DB 20 DUP ( ?) ; Zone vide de 20 positions

; ……Initialisations
PUSH DS
POP ES ; ES  DS
MOV SI, OFFSET Texte1 ; SI  Adresse de Texte1
MOV DI, OFFSET Texte2 ; DI  Adresse de Texte2
; les textes sont maintenant prèts à être manipulés
MOV AL, [SI] ; AL  ‘C’ (de ‘Ceci….’)
MOV AH, [DI] ; AH ‘V’ (de ‘Voici….’)
CMP AH, AL ; compare les 2 caractères Indicateurs affectés
; il faudrait réagir en fonction du Résultat de la comparaison
MOV AL, [SI+1] ; AL ’ e ‘ (de ‘Ceci….’)
MOV AH, [DI+1] ; AH ‘ o’ (de ‘Voici….’)
CMP AH, AL
………
………..
 ; Voici comment transferer le contenu de Texte2 dans Texte3

MOV SI, OFFSET Texte2 ; Texte2 est la « Source »


MOV DI, OFFSET Texte3 ; Texte3 est la « Destination »

; Transfert du premier caractère

MOV AL, [SI] ; AL’V’ (de ‘Voici…’)


MOV [DI] ,AL ; Texte3  le caractère ‘V’

; Transfert du second caractère

MOV AL, [SI+1] ; AL  ‘o’ (de ‘Voici’..)


MOV [DI+1] , AL ;Texte3  le caractère ‘o’

; Transfert du troisième caractère

MOV AL, [SI+2] ; AL ‘ i ‘ (de ‘Voici..)


MOV [DI+2] , AL ; Texte3 le caractère ‘i’

; Etc……………………..

Les instructions CLD et STD

CLD (Clear Direction Flag)


SI et DI sont incrementés (Indicateur DF=0)

STD (Set Direction Flag)


SI et DI sont décrementés (Indicateur DF=1)
Les Instructions MOVSW et MOVSB

MOVSB : Transfert de 1 Byte de la zone mémoire pointé par DS : SI vers la


Zone pointée par ES : DI
SI et DI sont automatiquement incrementés ou decrementé de 1 en fonction de la
valeur de DF.

MOVSW : Transfert de Mot de la zone mémoire pointé par DS : SI vers la Zone


pointée par ES : DI
SI et DI sont automatiquement incrementés ou decrementés de 2 en fonction de la
valeur de DF

Exemple :

; Transfert du contenu de Texte2 dans Texte3 (voir exemple avant)

Texte1 DB ‘Ceci est un texte ……….’


Texte2 DB ‘Voici un autre texte……’
Texte3 DB 20 DUP ( ?) ; Zone vide de 20 positions

; Initialisations

PUSH DS
POP ES ; ESDS

; Voici comment transférer le contenu de Texte2 dans Texte3

MOV SI, OFFSET Texte2 ; Texte2 est la source


MOV DI, OFFSET Texte3 ; Texte3 est la destination
CLD ; Mise à 0 de DF, Incrementation de SI et DI

; Transfert du premier caractère.

MOVSB ; Texte3  ‘V’


; ES : [DI]  DS : [SI],
; Incremente SI et DI de 1
; Transfert du second caractère.

MOVSB ; Texte3 ’o’


; ES : [DI]  DS :[SI]
; incremente SI et DI de 1

; Transfert du troisième caractère

MOVSB ; Texte3  ‘i’


; ES :[DI]  DS : [SI]
; incremente SI et DI de 1

; etc……

L’Instruction REP

REP MOVSB ; répété CX fois MOVSB


REP MOVSW ; répété CX fois MOVSW
REP … ; Autres instructions de manipulation
de chaines à répéter CX fois

NB :
Le nombre de répétition sera préalablement placé dans le registre CX.
Cette instruction REP n’est valable que pour les opérations sur les chaires de caractères
Exemple :

; En prenant l’exemple de transfert d’avant, en utilisant REP

Texte1 DB ‘ceci est un texte….’


Texte2 DB ‘voici un autre texte….’
Texte3 20 DUP ( ?)

; Initialisation
PUSH DS
POP ES ; ES  DS

; Voici comment transferer le contenu de Texte2 dans Texte3

MOV SI, OFFSET Texte2 ; Texte2 est la « source »


MOV DI, OFFSET Texte3 ; Texte3 est la « destination »
CLD ; incrémentation à prévoir DF = 
MOV CX , 23 ; en supposant il y a 23 caractères
dans Texte2

; Transfert de TOUS les caractères

REP MOVSB ; Texte3  Texte2


; répéter 23 fois MOVSB

NB : C’est simplifié !
Les Instruction CMPSB et CMPSW

CMPSB : Compare Byte

CMPSW : Compare Word

 Ces instructions comparent un Elément de 2 chaines de caractères


 Le premier étant pointé par DS :SI
 Le second étant pointé par ES :DI
 Après l’operateur, les registre SI et DI sont automatiquement incrementés (ou
decrementés) de 1 (CMPSB) ou de 2 (CMPSW)
 Cette instruction affecte les indicateurs pour indiquer le résultat de comparaison
Exemple :

; Comparaison de Texte1 et Texte2

; au lieu de

MOV AL, [SI]


MOV AH , ES: [DI]
CMP AL, AH

; On écrit simplement

CMPSB
V-4 Les Instructions d’Appel aux Interruptions

Un ordinateur est bien entendu équipé de toutes sortes de périphériques dont les plus
importants :
 Le clavier
 L’écran
 Les Disques
 L’Imprimante
 Etc……
 Pour accéder à ces périphériques, nous pouvons demander l’aide de MS-DOS
 A chaque périphérique correspond une fonction portant un NUMERO à laquelle le
programme doit transmettre des paramètres spécifiant le type de « Service Souhaité ».
Ceci se fait par l’intermédiaire des Registres
 Ces FONCTIONS sont appelées INTERRUPTION S

Les Instruction INT

INT imm

 Cette instruction appelle l’Interruption dont le Numéro est spécifié par l’Operande.
 Le numéro du service souhaité sera généralement installé dans AH avant l’appel.
Exemple :

 Pour afficher un caractère frappé au clavier à l’écran


MOV AH , 01h
INT 21h

 Pour afficher un Message à l’ecran

Bonjour DB ‘ Bonjour, mon nom est Michel$’


MOV AH,09h ; AH 09h
; Numéro de service pour affichage d’une chaine
MOV DX, OFFSET Bonjour ; DX  Paramètre
INT 21h ; appel à MS-DOS (Interruption 21h)

 Pour tester s’il y a un caractère au clavier


Attente d’une frappe au clavier avant de poursuivre l’execution d’un programme

MOV AH, 00h ; AH  00h


; Numéro de service pour tester si un caractère a été frappé au clavier
INT 16h ; Interruption 16h = Clavier

 Pour imprimer un caractère.

MOV AH, 0 ; AH  0
; Numéro de service pour imprimer le caractère dans AL
MOV AL,65 ; AL  Code ASCII d’un caractère
INT 17h ; Interruption 17h = Imprimante
Fin du Programme
INT 20
NOP

Vous aimerez peut-être aussi