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.
Tout d'abord, vous devez télécharger le fichier "emulator-demo.zip" à l'adresse suivante :
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 :
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 :
C'est ensuite cette page qui s'affiche :
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 :
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.
La barre d'outils illustrée ci-dessous consistera en votre poste de travail principal.
Les fonctions sont relativement explicites et simples d'utilisation. Je vais ici simplement détailler les fonctions qui concernent l'assemblage.
Permet de compiler le code en créant un fichier exécutable que vous pouvez enregistrer à l'endroit de votre choix. | >/tr>
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. |
Lorsque vous cliquez sur "emulate", c'est cette fenêtre qui s'ouvre :
Permet de charger une nouvelle source *.asm pour l'émuler. |
Permet de charger la source à nouveau pour recommencer l'émulation. |
Permet, lorsqu'elle est accessible, d'aller à l'instruction précédente lors de l'émulation instruction par instruction. |
Permet d'exécuter l'instruction en cours, et de passer à la suivante. |
Permet d'effectuer une émulation de la totalité du code, ce sera la fonction la plus utilisée. |
Permet 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 :
Fait apparaître la fenêtre représentant l'écran lors de l'émulation qui apparaît déjà (par défaut). |
Fait apparaître une page contenant la source, elle aussi déjà présente par défaut. |
Fait revenir à l'état initial, avant l'exécution du code. |
Affiche la fenêtre suivante : Qui rassemble toutes les variables définies dans le programme ainsi que leur valeur actuelle. |
Fait apparaître une fenêtre représentant les valeurs actuellement sur la pile. |
Fait apparaître une fenêtre indiquant la valeur actuelle des registres FLAG. |
Nous laisserons de côté pour le moment :
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
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.
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