La commande DEBUG de DOS

Objectifs du laboratoire

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!

Étapes à réaliser

Étape 1: création d'un fichier qui affiche un message à l'écran

À 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

Étape 2: Trace d'exécution d'un code avec la vérification du contenu de registres

À 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

  • Quelle est la valeur du registre accumulateur?
  • Quelle est la valeur du pointeur d'instruction?
  • Quel changement observez-vous dans les indicateurs?
  • Pouvez-vous donner une explication?

  • 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

  • Quelle est la valeur du registre accumulateur?
  • Quelle est la valeur du pointeur d'instruction?
  • Quel changement observez-vous dans les indicateurs?
  • Pouvez-vous donner une explication?

  • 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

  • Quelle est la valeur du registre accumulateur?
  • Quelle est la valeur du pointeur d'instruction?
  • Quel changement observez-vous dans les indicateurs?
  • Pouvez-vous donner une explication?

  • 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

  • Quelle est la valeur du registre accumulateur?
  • Quelle est la valeur du pointeur d'instruction?
  • Quel changement observez-vous dans les indicateurs?
  • Pouvez-vous donner une explication?

  • Étape 3: ouverture d'une deuxième page d'écran avec l'affichage d'un caractère avec son attribut

    À 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:

  • Enregistrez le fichier.
  • Exécutez le fichier en l'appelant à l'invité du DOS
  • ANNEXE

    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.