vendredi 28 août 2009

Partie I - Chapitre 2 : Utilisation d'un émulateur 80x86 et Généralités de syntaxe

Maintenant que nous avons situé et découvert le langage assembleur, nous allons étudier la syntaxe de l'assembleur qui n'est pas vraiment compliquée comme vous pourrez le voir. La mise en forme du programme reste relativement libre. Tout est à peu près permis tant qu'il n'y a qu'une seule instruction par ligne. Nous allons donc voir les principales caractéristiques syntaxiques de l'assembleur. Ensuite nous découvrirons le programme qui nous permettra de créer des fichiers exécutables à partir du code, ainsi que la fonction émulateur (que nous définirons) de ce logiciel.

Sommaire du chapitre :

  • Émulateur 80x86
  • Forme et syntaxe de l'assembleur


A - Émulateur 80x86




Comme nous l'avons vu précédemment l'assembleur exige une transposition en chiffres binaires par un interpréteur pour être compris par le processeur. Il en existe plusieurs dont certains très connus tels que : NASM, MASM. Nous allons plutôt nous pencher sur un émulateur.


Mais qu'est-ce qu'un émulateur ?

Un émulateur (asm) est un logiciel qui recrée les actions et les réactions d'un ordinateur lors de l'exécution d'un programme, dans notre cas, écrit en assembleur.
L'émulateur dégage certains avantages. Il permet une correction beaucoup plus facile. Il donne un aperçu en temps réel et indique la valeur des différents registres au cours de l'exécution...
Il s'agit d'un instrument très pratique.
Nous allons utiliser Emu8086.


Pourquoi ce choix ?

- Tout d'abord il est très simple d'utilisation et très pratique. En effet il comporte notamment une coloration syntaxique très claire.

- Il présente de nombreux exemples qui illustrent certains points tels que les fonctions de l'interruption 21h sur les fichiers, avec : ouverture, lecture, écriture, fermeture.

- Il possède de nombreux outils comme un convertisseur très évolué.

- Il y a beaucoup d'options lors de l'émulation :
  • instruction par instruction ;
  • évolution des variables et des registres au cours du programme.

1 - Première approche


Tout d'abord, vous devez télécharger le fichier "emulator-demo.zip" à l'adresse suivante :

Télécharger


Enregistrez le fichier sur votre ordinateur.

Vous devez ensuite extraire le dossier à l'aide de WinRar, si vous l'avez, sinon vous pouvez faire appel à un logiciel gratuit qui fonctionne très bien.
- UltimateZip : Télécharger


Une fois le dossier extrait, nous trouvons trois fichiers. Nous allons exécuter : "setup.exe".
Là, je vous laisse entre les mains du processus d'installation...

...Une fois le logiciel installé, lorsque vous le lancez, cette page apparaît :

Image utilisateur


Nous ne sommes pas encore sur le point de nous en servir, car l'assembleur demande beaucoup de bases et de concepts avant de pouvoir faire de simples programmes. Cependant, vous pourrez toujours essayer les petits exemples que nous verrons, en les tapant directement, puis en lançant l'émulation, sans se référer à la mise en forme particulière du programme en assembleur.

Revenons à notre page de départ. Lorsque vous voudrez écrire un programme, ou un simple bout de code, il vous suffira de cliquer sur :

Image utilisateur


C'est ensuite cette page qui s'affiche :

Image utilisateur


Cette page sert à définir les caractéristiques du fichier que vous allez écrire.

Effectivement, il existe différents types de fichiers écrits en assembleur. Nous verrons les deux principaux dans la troisième partie : *.exe et *.com . Nous laisserons les deux autres de côtés. Pour tous nos exemples, les deux types de fichiers pourront être utilisés. Le plus utilisé restera du moins le *.exe .

Vous pourrez néanmoins aussi choisir :

Image utilisateur


Qui vous fournira un espace de travail vierge, si ce n'est mieux.

L'option que vous aurez choisie vous fera déboucher sur la page principale.

2 - Les fonctions de cet émulateur


La barre d'outils illustrée ci-dessous consistera en votre poste de travail principal.

Image utilisateur


Les fonctions sont relativement explicites et simples d'utilisation. Je vais ici simplement détailler les fonctions qui concernent l'assemblage.

>/tr>
Image utilisateur
Permet de compiler le code en créant un fichier exécutable que vous pouvez enregistrer à l'endroit de votre choix.

Image utilisateur
Produit une émulation du code que vous avez tapé avec une représentation de l'écran de l'ordinateur dans une fenêtre et le code analysé dans une autre.

3 - L'émulation


Lorsque vous cliquez sur "emulate", c'est cette fenêtre qui s'ouvre :

Image utilisateur





Image utilisateurPermet de charger une nouvelle source *.asm pour l'émuler.

Image utilisateurPermet de charger la source à nouveau pour recommencer l'émulation.

Image utilisateurPermet, lorsqu'elle est accessible, d'aller à l'instruction précédente lors de l'émulation instruction par instruction.


Image utilisateur
Permet d'exécuter l'instruction en cours, et de passer à la suivante.

Image utilisateurPermet d'effectuer une émulation de la totalité du code, ce sera la fonction la plus utilisée.

Image utilisateurPermet d'affecter un temps d'attente entre l'exécution de chaque fonction.

La partie à gauche nommée registers indique l'évolution des registres au cours de l'exécution.

Ensuite nous trouvons les différents boutons situés en bas à droite :

Image utilisateurFait apparaître la fenêtre représentant l'écran lors de l'émulation qui apparaît déjà (par défaut).

Image utilisateurFait apparaître une page contenant la source, elle aussi déjà présente par défaut.

Image utilisateurFait revenir à l'état initial, avant l'exécution du code.

Image utilisateurAffiche la fenêtre suivante :
Image utilisateur

Qui rassemble toutes les variables définies dans le programme ainsi que leur valeur actuelle.

Image utilisateurFait apparaître une fenêtre représentant les valeurs actuellement sur la pile.

Image utilisateurFait apparaître une fenêtre indiquant la valeur actuelle des registres FLAG.

Nous laisserons de côté pour le moment :

Image utilisateur

Image utilisateur


B - Forme et syntaxe de l'assembleur


Majuscules

Il est très important de savoir que l'assembleur NE FAIT PAS ATTENTION A LA CASE..

En effet :

TotO = tOTo = TOTO = toto.

Exemple :

Code Assembler : Minuscules
1
2
3
4
5
6
7
8

jmp debut 
msg db "Hello, World$"
    
début :

mov dx, offset msg
mov ah, 9
int 21h

Ce petit programme qui permet d'afficher "Hello, World" ("$" : permettant repairer la fin de la chaîne de caractères), est le même que celui-ci :

Code Assembler : Majuscules
1
2
3
4
5
6
7
8

JMP debut 
msg DB "Hello, World$"
    
début :

MOV DX, OFFSET msg
MOV AH, 9
INT 21h

Je conseillerais d'écrire toutes les instructions en majuscule et d'écrire toutes les variables en minuscule comme sur le deuxième exemple. Cela permet de mieux se repérer.


Les commentaires

Les commentaires sont TRES IMPORTANTS, ils indiquent des explications sur les suites d'instructions concernées. Vous comprendrez vite que les programmes en assembleur deviennent rapidement très longs et qu'il est dur de s'y repérer. C'est pour cela qu'il est très important de commenter les étapes du code. Vous remarquerez que les relectures et les corrections deviennent beaucoup plus faciles. Je reconnais très bien que les commentaires sont fastidieux mais ils sont très importants.

Un point-virgule annonce le début d'un commentaire.

Exemple :

Code Assembler : Commentaires
1
2

Instruction ; Commentaire 1
Instruction ; Commentaire 2

Voici l'exemple d'un code complètement commenté :

Code Assembler
1
2
3
4
5
6
7
8

JMP debut          ; Aller à 'début'
 
msg    db "..."    ; Définit la chaîne de caractères à afficher
 
debut:
MOV DX, offset msg1 ; précise l'emplacement de la chaîne de caractères
MOV AH, 9           ; Appelle la 9ème sous - fonction
INT 21h             ; De l'interruption 21h(hexadécimal) du DOS


Le retour à la ligne

En assembleur il ne peut y avoir qu'une seule instruction par ligne :

Exemple :

Code Assembler
1
2

MOV AX, 5  ; Déplacer 5 dans AX 
MOV CX, AX ; Déplacer AX dans CX

Nous ne pouvons pas écrire :

Code Assembler
1
MOV AX, 5    MOV CX, AX

De plus dans un code nous pouvons sauter autant de lignes que nous le souhaitons. Je vous conseille donc de bien espacer les différentes parties de code qui fonctionnent ensemble. Par exemple voici un code pour tracer un pixel :

Code Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

; Partie sauvegarde des valeurs des registres :
PUSH CX  ; Sauvegarde le contenu de CX
PUSH DX  ; Sauvegarde le contenu de DX
PUSH AX  ; Sauvegarde le contenu de AX
 
; Appel de la fonction impliquant la modification 
; des registres sauvegardés au préalable
MOV CX, [BP + 4] ; Récupère la valeur de X 
MOV DX, [BP + 4] ; Récupère la valeur de Y 
MOV AL, 15  ; Numéro de la couleur
MOV AH, 0ch ; Sous-fonction 0C en hexadécimal
INT 10h     ; Fonction 10 en héxadécimal
 
; Partie réstoration des registres :
POP AX  ; Restaure le contenu de AX
POP DX  ; Restaure le contenu de DX
POP CX  ; Restaure le contenu de CX

Enfin, il est TRÈS IMPORTANT d'aller à la ligne à la fin de la dernière instruction du programme pour qu'elle soit prise en compte par l'interpréteur.


Les guillemets et virgule ou point

  • Les guillemets


  • Dans ce langage vous devez savoir que l'apostrophe (') est identique aux guillemets (") donc "a" = 'a', après c'est une question de goût.

    Nous pouvons donc retrouver les deux cas :

    Code Assembler
    1

    msg DB 'Bonjour$'

    Ou :

    Code Assembler
    1

    msg DB "Bonjour$"

    Qui sont au final équivalents.


  • Point ou virgule


  • Il est important de savoir que de manière générale, l'ordinateur utilise le point pour présenter les nombres décimaux. On n'écrira donc pas 2,5 mais 2.5.

    La virgule sert à séparer deux opérandes dans une instruction.


    Espacement

    Au même titre que les retours à la ligne, vous pouvez écrire autant d'espaces que vous voulez. Que se soit devant l'instruction, après ou encore entre les opérandes.

    Exemple :

    Code Assembler : Espacement
    1
    2

    MOV    AX,    2     ; Déplace 2 dans AX
    ADD    AX,    2     ; Ajoute 2 à AX

    est équivalent à :

    Code Assembler : Espacement
    1
    2

    MOV AX, 2 ; Déplace 2 dans AX
    ADD AX, 2 ; Ajoute 2 à AX

    Par contre il est IMPOSSIBLE de coller les instructions et les opérandes. On ne peut donc pas rencontrer un code du type :

    Code Assembler
    1
    MOVCX,AX

    Mais évidemment :

    Code Assembler
    1
    MOV CX,AX

    Aucun commentaire:

    Enregistrer un commentaire