Accueil
Rechercher:
sur developpez.com sur les forums
Forums | Tutoriels | F.A.Q's | Participez | Hébergement | Contacts
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi MS-Office SQL & SGBD Oracle  4D  Business Intelligence
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
FORUM ASSEMBLEUR FAQ ASSEMBLEUR LIVRES ASSEMBLEUR
TROISIEME PARTIE

LE LANGAGE ASSEMBLEUR


    III. LES PRINCIPALES INSTRUCTIONS DU LANGAGE MACHINE

Remarques préliminaires :

  • Le principe du langage assembleur est de remplacer chaque opcode hexadécimal par un mot facile à retenir. Ce mot est appelé mnémonique. Par exemple, “INT” est le mnémonique associé à l’opcode CDh. Chaque fois que le compilateur rencontrera ce mot, il le remplacera par l’octet CDh et écrira ensuite l’opérande (ici : le numéro de l’interruption) en hexadécimal.

  • Cette liste récapitule les instructions que nous connaissons déjà et en présente de nouvelles. Elle n’est pas exhaustive mais vous sera amplement suffisante pour la plupart de vos programmes.

  • Certaines instructions, comme PUSHA, ne sont disponibles que pour des modèles de processeurs plus évolués que le 8086, par exemple le 286. N’oubliez pas la directive .386 si vous les utilisez.

    1. L’instruction NOP (« No Operation »)

Syntaxe : NOP

Description : Ne fait rien ! Mais alors RIEN ! Que dalle ! Niet !

    2. L’instruction MOV (« Move »)

Syntaxe : MOV Destination, Source

Description : Copie le contenu de Source dans Destination.

Mouvements autorisés : MOV Registre général, Registre quelconque

MOV Mémoire, Registre quelconque

MOV Registre général, Mémoire

MOV Registre général, Constante

MOV Mémoire, Constante

MOV Registre de segment, Registre général

Remarques : Source et Destination doivent avoir la même taille. On ne peut charger dans un registre de segment que le contenu d’un registre général (SI, DI et BP sont considérés ici comme des registres généraux).

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 spécifie que la variable est un word

    3. L’instruction XCHG (« Exchange »)

Syntaxe : XCHG Destination, Source

Description : Echange les contenus de Source et de Destination.

Mouvements autorisés : XCHG Registre général, Registre général

XCHG Registre général, Mémoire

XCHG Mémoire, Registre général

    4. L’instruction JMP (« Jump »)

Syntaxe : JMP MonLabel

Description : Saute à l’instruction pointée par MonLabel.

    5. L’opérateur CMP (« Compare »)

Syntaxe : CMP Destination, Source

Description : Cet opérateur sert à comparer deux nombres : Source et Destination. C'est le registre des indicateurs qui contient les résultats de la comparaison. Ni Source ni Destination ne sont modifiés.

Indicateurs affectés : AF, CF, OF, PF, SF, ZF

Remarque : Cet opérateur effectue en fait une soustraction mais contrairement à SUB, le résultat n’est pas sauvegardé.

Le programme doit pouvoir réagir en fonction des résultats 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 données.

Un saut conditionnel n’est effectué qu’à certaines conditions portant sur les flags (par exemple : CF = 1 ou ZF = 0).

Certains mnémoniques de sauts conditionnels sont totalement équivalents, c’est-à-dire qu’ils représentent le même opcode hexadécimal. C’est pour aider le programmeur qu’ils existent parfois sous plusieurs formes.

    a) les sauts de comparaison

  • JE (« Jump if Equal ») fait un saut au label spécifié si et seulement si ZF = 1. Rappelez-vous que ce flag est à 1 si et seulement si le résultat de l’opération précédente vaut zéro. Comme CMP réalise une soustraction, on utilise généralement JE pour savoir si deux nombres sont égaux.

Exemple :

Mnémonique équivalent : JZ (« Jump if Zero »)

  • JG (« Jump if Greater ») fait un saut au label spécifié si et seulement si ZF = 0 et SF = OF. On l’utilise en arithmétique signée pour savoir si un nombre est supérieur à un autre.

Exemple :

Mnémonique équivalent : JNLE (« Jump if Not Less Or Equal »)

  • JGE (« Jump if Greater or Equal ») fait un saut au label spécifié si et seulement si SF = OF. On l’utilise en arithmétique signée pour savoir si un nombre est supérieur ou égal à un autre.

Mnémonique équivalent : JNL (« Jump if Not Less »)

  • JL (« Jump if Less ») fait un saut au label spécifié si et seulement si SF <> OF. On l’utilise en arithmétique signée pour savoir si un nombre est inférieur à un autre.

Mnémonique équivalent : JNGE (« Jump if Not Greater Or Equal »)

  • JLE (« Jump if Less Or Equal ») fait un saut au label spécifié si et seulement si SF <> OF ou ZF = 1. On l’utilise en arithmétique signée pour savoir si un nombre est inférieur ou égal à un autre.

Mnémonique équivalent : JNG (« Jump if Not Greater »)

  • JA (« Jump if Above ») fait un saut au label spécifié si et seulement si ZF = 0 et CF = 0. On l’utilise en arithmétique non signée pour savoir si un nombre est supérieur à un autre.

Mnémonique équivalent : JNBE (« Jump if Not Below Or Equal »)

  • JAE (« Jump if Above or Equal ») fait un saut au label spécifié si et seulement si CF = 0. On l’utilise en arithmétique non signée pour savoir si un nombre est supérieur ou égal à un autre.

Mnémonique équivalent : JNB (« Jump if Not Below »)

  • JB (« Jump if Below ») fait un saut au label spécifié si et seulement si CF = 1. On l’utilise en arithmétique non signée pour savoir si un nombre est inférieur à un autre.

Mnémonique équivalent : JNAE (« Jump if Not Above Or Equal »)

  • JBE (« Jump if Below or Equal ») fait un saut au label spécifié si et seulement si CF = 1 ou ZF = 1. On l’utilise en arithmétique non signée pour savoir si un nombre est inférieur ou égal à un autre.

Mnémonique équivalent : JNA (« Jump if Not Above »)

    b) les sauts de test sur les flags

Ces instructions testent un flag unique et exécutent ou non le saut selon la valeur de ce flag.

  • JC (« Jump if Carry ») fait un saut au label spécifié si et seulement si CF = 1.

Remarques : Ce mnémonique correspond au même opcode que JB. Il est souvent employé pour vérifier que l’appel d’une interruption n’a pas déclenché d’erreur.

Exemple :

Si l’appel de la fonction 3Eh de l’interruption 21H se solde par une erreur, alors la CF vaudra 1 et le saut sera accompli. Dans le cas opposé, l’exécution continuera normalement de manière linéaire.

  • JNC (« Jump if not Carry ») fait un saut au label spécifié si et seulement si CF = 0.

  • JZ (« Jump if Zero ») fait un saut au label spécifié si et seulement si ZF = 1. Ce mnémonique correspond au même opcode que JE.

  • JNZ (« Jump if not Zero ») fait un saut au label spécifié si et seulement si ZF = 0. Ce mnémonique correspond au même opcode que JNE.

  • JS (« Jump if Sign ») fait un saut au label spécifié si et seulement si SF = 1.

  • JNS (« Jump if not Sign ») fait un saut au label spécifié si et seulement si SF = 0.

  • JO (« Jump if Overflow ») fait un saut au label spécifié si et seulement si OF = 1.

  • JNO (« Jump if not Overflow ») fait un saut au label spécifié si et seulement si OF = 0.

  • JP (« Jump if Parity ») fait un saut au label spécifié si et seulement si PF = 1.

  • JNP (« Jump if not Parity ») fait un saut au label spécifié 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 spécifié si et seulement si CX = 0.



Sommaire

Suite



Responsable bénévole de la rubrique Assembleur : Florent Humbert (Millie) - Contacter par EMail :
Vos questions techniques : forum d'entraide Assembleur - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Copyright © 2000-2008 www.developpez.com - Legal informations.