Se familiariser avec les concepts d'adresse, de registres et de pseudo-instructions de l'assembleur Intel à l'aide de la commande DEBUG.
La commande DEBUG de DOS permet de lancer le programme DEBUG.EXE qui met au point des fichiers exécutables. Notez bien que dans le DEBUG, toutes les valeurs entrées sont par défaut hexadécimales.
Note: |
Vous trouverez dans ce document quatre (4) séries de questions auxquelles vous devrez répondre--ce que vous pourrez faire par équipe de deux (2) maximum. Vous devrez remettre vos résultats clairement identifiés au professeur à la fin du cours. Vous devrez aussi montrer au professeur l'exécution du programme AFFICHE.COM pour avoir vos points. Attention de ne pas prendre ce petit laboratoire à la légère, et de ne pas recopier à l'aveuglette le code que vous y trouverez. Comprendre ce que vous faites maintenant vous sauvera beaucoup de maux de tête dès la semaine prochaine. Amusez vous-bien! |
À l'invité du DOS, lancez le programme DEBUG.EXE
À l'invité du programme DEBUG, tapez A 100 pour commencer l'assemblage.
Votre écran ressemblera à celui-ci[1]:
C:\WINDOWS>debug |
-A 100 ;on se place à l'adresse 100h dans un segment de mémoire, ;le programme doit toujours commencer à l'adresse 100h XXXX:0100 |
Le XXXX représente l'adresse du segment de mémoire qu'on utilise et 0100 représente l'offset dans ce segment.
Note: | Pour chaque ordinateur l'adresse du segment XXXX peut être différente. Prenez soin d'utiliser la bonne adresse pour vos fins, et ne recopiez pas le code de ce document à l'aveuglette! |
Tapez le code suivant[2]:
MOV AH,09 ; place 09h dans le registre AH MOV DX,0109 ; place l'adresse 0109h dans le registre DX. Le registre DX ; doit contenir l'adresse de la chaîne de caractères à afficher ; à l'écran INT 21 ; appel d'interruption 21h de DOS qui, accompagnée de ; la fonction 9h permettant d'afficher une chaîne ; de caractères à l'écran INT 20 ; l'interruption 20h de DOS permet la terminaison ; du programme DB 'Bonjour tout le monde',D,24 ; la chaîne à afficher, le caractère D (13 en hexadécimale ; qui représente le Carriage Return) et le caractère 24h ; (qui correspond au code ASCII du ;caractère '$') ; pour terminer la chaîne de caractères à afficher |
À la fin, appuyez sur Enter pour revenir à l'invité du programme DEBUG. Nous sommes prêts à exécuter notre programme. Tapez la lettre G pour exécuter...
Votre écran ressemblera au suivant:
C:\WINDOWS>debug |
-A 100 1773:0100 MOV AH,9 1773:0102 MOV DX,0109 1773:0105 INT 21 1773:0107 INT 20 1773:0109 DB 'Bonjour tout le monde',D,24 1773:0120 -G |
Bonjour tout le monde |
Le programme s'est terminé normalement
Pour enregistrer le fichier, à l'invité de la commande DEBUG tapez sur N et donnez le nom de fichier (bonjour.com):
-N bonjour.com ;le fichier assemblé sera enregistré sous le nom 'bonjour.com' -RCX ;entre le nombre d'octets à enregistrer dans le registre CX CX 0000 ;affiche que le registre CX contient 0 (pour l'instant) :120 ;le nombre d'octets à entrer dans le CX, cette valeur correspond ;à la dernière adresse affichée lors de l'assemblage -W ;pour écrire le code fraîchement assemblé dans le fichier 'Bonjour.com' -Q ;pour quitter le programme DEBUG |
Votre écran ressemblera à celui-ci:
-N bonjour.com -RCX CX 0000 :120 -W |
Écriture de 00120 octets |
-Q |
Vous pouvez maintenant exécuter votre petit programme en l'appelant à l'invité du DOS comme ceci:
C:\WINDOWS>BONJOUR |
À l'invité du DOS, lancez le programme DEBUG.EXE
À l'invité du programme DEBUG tapez A 100 pour commencer l'assemblage.
MOV AX,FFFF ;place la valeur FFFF dans le registre AX MOV BX,FFFF ;place la valeur FFFF dans le registre BX ADD AX,BX ;additionne les valeurs AX et BX et place le résultat dans AX MOV AX,0001 ;place la valeur 0001 dans le registre AX DEC AX ;décrément la valeur dans le registre AX INC AX ;incrément la valeur dans le registre AX SUB AX,0002 ;soustrait la valeur 2h de registre AX et place le résultat dans AX MOV AH,70 ;place la valeur 70h dans le registre AH MOV BH,50 ;place la valeur 50h dans le registre BH ADD AH,BH ;additionne la valeur dans AH à la valeur dans BH et place le résultat dans AH |
Votre écran ressemblera à celui-ci:
C:\WINDOWS>DEBUG |
-A 100 1773:0100 MOV AX,FFFF 1773:0103 MOV BX,FFFF 1773:0106 ADD AX,BX 1773:0108 MOV AX,0001 1773:010B DEC AX 1773:010C INC AX 1773:010D SUB AX,0002 1773:0110 MOV AH,70 1773:0112 MOV BH,50 1773:0114 ADD AH,BH 1773:0116 |
Pour tracer l'exécution de votre petit code, tapez la lettre T et observez le contenu des registres (la première fois, tapez la lettre R pour afficher le contenu de registres avant l'exécution de la première instruction):
-R AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1773 ES=1773 SS=1773 CS=1773 IP=0103 NV UP EI PL NZ NA PO NC 1773:0103 BBFFFF MOV AX,FFFF |
-T AX=FFFF BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1773 ES=1773 SS=1773 CS=1773 IP=0103 NV UP EI PL NZ NA PO NC 1773:0103 BBFFFF MOV BX,FFFF |
Après la première instruction MOV AX,FFFF, le contenu de registre AX est FFFF, les autres registres "tout usage" sont à 0.
Remarquez que les registres de segment (DS, ES, CS et SS) contiennent tous la même valeur: 1773 dans ce cas (rappel: cette valeur peut être différente pour chaque ordinateur). Cela signifie que tout le programme au complet n'occupe qu'un segment, ce qui est toujours le cas pour des programmes qui ont l'extension .COM.
Le pointeur d'instructions IP pointe à l'adresse de l'instruction suivante à exécuter: 103.
Observez le contenu des indicateurs...
NV | indique qu'il n'y a pas de débordement (No Overflow, OF = 0) |
PL | indique que la dernière opération résulte en valeur est positive (SF = 0) |
NZ | indique que le résultat de la dernière opération est différent de zéro (No Zero, ZF = 0) |
NC | indique qu'il n'y a pas de retenu (No Carry, CF = 0) |
Continuons de suivre la trace d'exécution de notre code:
-T AX=FFFF BX=FFFF CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1773 ES=1773 SS=1773 CS=1773 IP=0106 NV UP EI PL NZ NA PO NC 1773:0106 01D8 ADD AX,BX |
-T AX=FFFE BX=FFFF CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1773 ES=1773 SS=1773 CS=1773 IP=0108 NV UP EI NG NZ AC PO CY 1773:0108 B80100 MOV AX,0001 |
Série de questions #1 |
---|
Continuons de suivre la trace d'exécution de notre code:
-T AX=0001 BX=FFFF CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1773 ES=1773 SS=1773 CS=1773 IP=010B NV UP EI NG NZ AC PO CY 1773:010B 48 DEC AX |
-T AX=0000 BX=FFFF CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1773 ES=1773 SS=1773 CS=1773 IP=010C NV UP EI PL ZR NA PE CY 1773:010C 40 INC AX |
Série de questions #2 |
---|
Continuons de suivre la trace d'exécution de notre code:
-T AX=0001 BX=FFFF CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1773 ES=1773 SS=1773 CS=1773 IP=010D NV UP EI PL NZ NA PO CY 1773:010D 2D0200 SUB AX,0002 |
-T AX=FFFF BX=FFFF CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1773 ES=1773 SS=1773 CS=1773 IP=0110 NV UP EI NG NZ AC PE CY 1773:0110 B470 MOV AH,70 |
Série de questions #3 |
---|
Continuons de suivre la trace d'exécution de notre code:
-T AX=70FF BX=FFFF CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1773 ES=1773 SS=1773 CS=1773 IP=0112 NV UP EI NG NZ AC PE CY 1773:0112 B750 MOV BH,50 |
-T AX=70FF BX=50FF CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1773 ES=1773 SS=1773 CS=1773 IP=0114 NV UP EI NG NZ AC PE CY 1773:0114 00FC ADD AH,BH |
-T AX=C0FF BX=50FF CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=1773 ES=1773 SS=1773 CS=1773 IP=0116 OV UP EI NG NZ NA PE NC 1773:0116 6E DB 6E |
Série de questions #4 |
---|
À l'invité du DOS, lancez le programme DEBUG.EXE suivi du nom du fichier que vous allez créer (affiche.com)
Tapez A 100 pour commencer l'assemblage.
C:\WINDOWS>DEBUG AFFICHE.COM |
Fichier introuvable |
-A 100 |
Les instructions suivantes permettent d'ouvrir la deuxième page d'écran. En mode VGA on peut utiliser jusqu'à 8 pages d'écran numérotées de 0 à 7) et la page 0 est celle affichée par défaut.
MOV AH,05 ; place la fonction 5 dans le registre AH MOV AL,01 ; place le numéro de la page à afficher dans le registre AL INT 10 ; appelle l'interruption 10h de BIOS qui, combinée à la ; fonction 5, permettant d'afficher la page demandée |
Les instructions suivantes permettent de positionner le curseur au milieu de l'écran.
MOV AH,02 ; place la fonction 2 dans le registre AH MOV BH,01 ; place la valeur 1 dans le registre BH (numéro de page à afficher) MOV DH,0C ; place la valeur 12 dans le registre DH (12ième ligne) MOV DL,27 ; place la valeur 39 dans le registre DL (39ième colonne) INT 10 ; appelle l'interruption 10h de BIOS qui, combinée à la ; fonction 2, permet de positionner le curseur à la position demandée |
Les instructions suivantes permettent d'imprimer le caractère A en Cyan 16 fois à l'écran
MOV AH,09 ; place la fonction 9 dans le registre AH MOV AL,41 ; place le caractère A dans le registre AH (41h est le code ASCII de ; la lettre A) MOV BH,01 ; place la valeur 1 dans le registre BH (affiche à la page 1) MOV BL,03 ; place la valeur 3 dans le registre BL (attribut de caractère Cyan[3]) MOV CX,0010 ; place la valeur 16 dans le registre CX (le nombre de fois que ; le caractère sera affiché INT 10 ; appelle l'interruption 10h de BIOS qui, combinée à la ; fonction 9, permet d'afficher le caractère avec son attribut |
Les instructions suivantes permettent d'attendre qu'on appuie sur une touche (pour continuer)
MOV AH,06 ;place la fonction 6 dans le registre AH MOV AL,00 ;place la valeur 0 dans le registre AL MOV DL,FF ;place la valeur FF dans le registre DL INT 21 ;appelle l'interruption 21h de DOS qui, combinée à la ;fonction 6, permet de lire le caractère au clavier sans écho. ;La valeur du caractère lu est stockée dans AL. CMP AL,00 ;Tant que le contenu de AL est à 0, JZ 011D ;on effectue la lecture (011D est l'adresse de la première instruction de ;la boucle qui correspond à MOV AH,06 |
Les instructions suivantes permettent de revenir à l'écran par défaut (0)
MOV AH,05 MOV AL,00 ;écran numéro 0 INT 10 INT 20 ;fin de programme |
Maintenant:
Les codes d'attributs et les couleurs de caractères correspondantes:
01h | bleu | 02h | vert | 03h | cyan |
04h | rouge | 05h | magenta | 06h | brun |
07h | blanc | 08h | gris | 09h | bleu clair |
0ah | vert clair | 0bh | cyan clair | 0ch | rouge clair |
0dh | magenta clair | 0eh | jaune | 0fh | blanc intense |
[1] Attention: il est possible que DEBUG.EXE soit dans le répertoire C:\WINDOWS\COMMAND\ plutôt que dans C:\WINDOWS\.
[2] Vous n'avez pas à recopier les commentaires; ils sont là seulement dans le but de vous guider.
[3] Pour connaître d'autres codes d'attribut, référez-vous à la fin de ce document.