Spaceuit


Informatique Appliquée

Fillière Intelligence Artificielle

Automne 2024

Ali El Hourch
[email protected]


Guide
Nouveau
Assistant AI
Visual Studio Code Google Classroom Whatsapp Whatsapp Discord Discord
Module 1: Probabilités Et Statistiques Module 2: Architecture Des Ordinateurs Module 3: Structure De Données En C Module 4: Système d'exploitation 1 Module 5: Programmation Web 1 Module 6: Langues Etrangéres Module 7: Compétences Culturelles & Artistiques

Semestres

Automne 2024

Tronc Communs

Informatique Appliquée

Débuggeur


Série


Débogage


  • Le débogage est la recherche des erreurs.
  • Il existe :
    • de nombreux logiciels qui offrent un outil de débogage dans leur environnement intégré,
    • des programmes spéciaux pour le débogage.
  • Un débogueur permet, entre autres :
    • l’affichage des informations sur les variables, les registres, etc.,
    • l’exécution d’un programme pas à pas ou son exécution jusqu’à un point d’arrêt.

Comment installer MSDOS


Commandes de DEBUG avec exemples


  • Commandes de Debug :
  • Commande Description Exemple
    ? Affiche une liste des commandes de Debug. ?
    a Assemble les mnémoniques. a 0100 (commence l'assemblage à l'adresse 0100h)
    c Compare deux zones de la mémoire. c 0100 0200 (compare les données entre 0100h et 0200h)
    d Affiche le contenu d’une zone de la mémoire. d 0100 (affiche le contenu de la mémoire à partir de 0100h)
    e Entrer des données en mémoire à partir d’une adresse donnée. e 0100 "Hello" (écrit "Hello" à l'adresse 0100h)
    f Remplit une zone de mémoire avec des valeurs données. f 0100 0200 00 (remplit de 00 entre 0100h et 0200h)
    g Exécute le programme chargé en mémoire. g (démarre l'exécution à l'adresse actuelle)
    h Réalise des opérations arithmétiques sur des valeurs hexadécimales. h 2A 10 (affiche les résultats de 2A + 10 et 2A - 10)
    i Affiche un octet d’un port donné. i 60 (lit la valeur du port 60h)
    l Charge en mémoire un fichier ou des secteurs de disque. l (lit un fichier spécifié dans Debug)
    m Copie le contenu d’un bloc de mémoire. m 0100 0200 0300 (copie les données de 0100-0200 vers 0300)
    n Spécifie un nom de fichier pour les commandes l ou w. n fichier.txt (spécifie "fichier.txt" pour les commandes)
    o Envoie la valeur d’un octet vers un port de sortie. o 60 12 (envoie la valeur 12 au port 60h)
    p Exécute une boucle, une instruction de chaîne ou une sous-routine. p (passe à l'instruction suivante dans une boucle)
    q Quitte Debug. q
    r Affiche ou modifie le contenu d’un ou plusieurs registres. r ax (affiche et modifie le registre AX)
    s Recherche, dans une zone de mémoire, une séquence d’octets spécifiée. s 0100 0200 "test" (recherche "test" entre 0100h et 0200h)
    t Exécute une instruction et affiche les registres et instructions suivantes. t (trace pas à pas une instruction)
    u Désassemble des octets et affiche les instructions source correspondantes. u 0100 (désassemble à partir de 0100h)
    w Écrit le fichier en cours de mise au point sur disque. w
    xa Alloue de la mémoire paginée. xa
    xd Désactive l’allocation d’un descripteur de mémoire paginée. xd
    xm Affecte des pages logiques aux pages physiques. xm
    xs Affiche des informations sur l’état de la mémoire paginée. xs

Exploration de la mémoire


  1. Afficher le contenu de la mémoire à l'adresse par défaut (sans spécifier une plage mémoire particulière) sous trois formats différents :
    • - Octets en hexadécimal
    • - Octets en ASCII
    • - Instructions
    Conseil
    • Utiliser la commande -d [adresse] pour afficher le contenu de la mémoire avec ou sans spécifier une plage mémoire sous format hexadécimal et ASCII
    • Utiliser la commande -u [adresse] pour afficher le contenu de la mémoire avec ou sans spécifier une plage mémoire sous format instruction
    Correction
    • Lancer le mode debug de DOSBox :
    • debug
    • Utilisez la commande d (dump) pour afficher la mémoire sous forme hexadécimale à l'adresse par défaut :
    • d
    • Cette commande affiche un bloc de mémoire (Adresse segment et l'offset) avec ses valeurs en hexadécimal et en ASCII.
    • SEGMENT:OFFSET                  HEXADÉCIMAL                              ASCII
    • Utilisez la commande u (unassemble) pour interprèter la mémoire comme du code machine et affiche les instructions en assembleur:
    • u
    • SEGMENT:OFFSET   INSTRUCTION (LANGAGE MACHINE)  INSTRUCTION (ASSEMBLY)
  2. Relevez l'adresse du premier octet décodé (segment et offset). Nous appellerons le segment trouvé "segment de travail".
  3. Conseil
    • Vous pouvez utiliser la commande u ou d.
    Correction
    • Lancez la commande u dans le débogueur DOSBox :
    • u
    • Le segment de travail identifié est 073F, et l'offset initial est 0100. L'adresse du premier octet décodé est donc: 073F:0100
  4. Relevez les 32 premiers octets décodés sous les trois formes cités en 1.
  5. Correction
    • Lancez la commande d 0100 dans le débogueur DOSBox pour afficher les octets à partir de l'adresse 073F:0100:
    • d 0100
    • Voici les 32 premiers octets décodés sous les deux formes :
    • Format hexadécimal :
    • C3 26 89 1E 06 00 E8 CF 06 F8 C3 E8 D3 05 E8 34
      2E 26 A1 0A 00 E8 3C 3A 0C 20 26 A2 34 00 2E 07
      
    • Format ASCII :
    • .&............4
      .&....<:.&.4...
      
  6. Remplissez de 00 le premier Ko du segment de travail.
  7. Correction
    • On a: 1Ko = 1024 octets
    • Le segment de travail est 073F donc le debut de segment de travail est 073F:0000.
    • Nous rappelons que les adresses sont en hexadécimal donc :
    • 1024)10 = 400)16 (Decimal vers hexadécimal)
    • Si on commence à 073F:0000, l'adresse de fin sera calculée comme :
    • 0000 (départ) + 0400 (taille de 1 Ko) - 1 = 0400 - 1 = 03FF
    • Lancez la commande f 0000 03FF 00 dans le débogueur DOSBox pour remplir par 00 à partir de l'adresse 073F:0000 à l'adresse 073F:03FF qui correspond à 1Ko :
    • f 0000 03FF 00
  8. Placez les caractères "SMI" au debut du segment de travail. Vérifier que ces caractères sont bien rangés en mémoire et relevez en Hexa les 16 premiers octets du segment de travail.
  9. Conseil
    • Vous pouvez utiliser la commande e pour entrer des données en mémoire à partir d’une adresse donnée.
    Correction
    • Lancez la commande e 0000 "SMI" dans le débogueur DOSBox pour remplir "SMI" à partir de l'adresse 073F:0000:
    • e 0000 "SMI"
    • Puis lancez la commande d 0000 pour afficher les 16 premier octets à partir de 0000 :
    • d 0000
    • On trouve:
    • 53 4D 49 00 00 00 00 00 00 00 00 00 00 00 00 00
    • Qui correspond à "SMI" selon le table ASCII
    • Hex  Char                           Hex  Char     Hex  Char     Hex  Char
      ---------                           ---------     ---------     ----------
       00  NUL (null)                      20  SPACE     40  @         60  `
       01  SOH (start of heading)          21  !         41  A         61  a
       02  STX (start of text)             22  "         42  B         62  b
       03  ETX (end of text)               23  #         43  C         63  c
       04  EOT (end of transmission)       24  $         44  D         64  d
       05  ENQ (enquiry)                   25  %         45  E         65  e
       06  ACK (acknowledge)               26  &         46  F         66  f
       07  BEL (bell)                      27  '         47  G         67  g
       08  BS  (backspace)                 28  (         48  H         68  h
       09  TAB (horizontal tab)            29  )         49  I         69  i
       0A  LF  (NL line feed, new line)    2A  *         4A  J         6A  j
       0B  VT  (vertical tab)              2B  +         4B  K         6B  k
       0C  FF  (NP form feed, new page)    2C  ,         4C  L         6C  l
       0D  CR  (carriage return)           2D  -         4D  M         6D  m
       0E  SO  (shift out)                 2E  .         4E  N         6E  n
       0F  SI  (shift in)                  2F  /         4F  O         6F  o
       10  DLE (data link escape)          30  0         50  P         70  p
       11  DC1 (device control 1)          31  1         51  Q         71  q
       12  DC2 (device control 2)          32  2         52  R         72  r
       13  DC3 (device control 3)          33  3         53  S         73  s
       14  DC4 (device control 4)          34  4         54  T         74  t
       15  NAK (negative acknowledge)      35  5         55  U         75  u
       16  SYN (synchronous idle)          36  6         56  V         76  v
       17  ETB (end of trans. block)       37  7         57  W         77  w
       18  CAN (cancel)                    38  8         58  X         78  x
       19  EM  (end of medium)             39  9         59  Y         79  y
       1A  SUB (substitute)                3A  :         5A  Z         7A  z
       1B  ESC (escape)                    3B  ;         5B  [         7B  {
       1C  FS  (file separator)            3C  <         5C  \         7C  |
       1D  GS  (group separator)           3D  =         5D  ]         7D  }
       1E  RS  (record separator)          3E  >         5E  ^         7E  ~
       1F  US  (unit separator)            3F  ?         5F  _         7F  DEL
      
  10. Entrez le code:
      B4 4C CD 21   
    à l'adresse 100h
  11. A quelles instructions correspond ce code ?
    Exécutez ce code. Que se passe-t-il ? Pourquoi ?
  12. Correction
    • Lancez la commande e 0100 B4 4C CD 21 dans le débogueur DOSBox pour remplir B4 4C CD 21 à partir de l'adresse 073F:0100:
    • e 0100 B4 4C CD 21
    • On a le tableau suivante :
    • Asm  Instruction                    Hex  Code       Asm  Instruction              Hex  Code
      ----------------                    ---------       ----------------              ---------
      MOV AX, BX                          89 D8           MOV AL, 34h                  B0 34
      ADD AX, BX                          01 D8           SUB AX, BX                   29 D8
      INC AX                              40              DEC AX                       48
      PUSH AX                             50              POP AX                       58
      MOV [1234h], AX                     A3 34 12        MOV AX, [1234h]              A1 34 12
      MOV BX, 4Ch                         BB 4C 00        MOV AH, 4Ch                  B4 4C
      INT 21h                             CD 21           JMP 1234h                    E9 34 12
      RET                                 C3              CALL 1234h                   E8 34 12
      NOP                                 90              HLT                          F4
      SHL AX, 1                           D1 E0           SHR AX, 1                    D1 E8
      CMP AX, BX                          39 D8           JE 1234h                     74 34
      
    • D'après le tableau, on remarque que B4 4C correspond à MOV AH, 4Ch et CD 21 correspond à INT 21h
    • Pour le confirmer, exécutez u 0100 pour désassembler les octets à l'adresse 0100 et afficher les instructions source correspondantes :
    • u 0100
    • L'instruction
      MOV AH, 4Ch
      INT 21h
      
      exécute une fonction DOS pour terminer le programme.
    • Pour exécuter une programme sous debug lancez la commande g :
    • g
    • Nous observons qu'après l'exécution de g, le programme debug quitte et retourne à dosbox
  13. Pouvez-vous relire les caractères "SMI" introduits précédemment ? Pourquoi ?
  14. Correction
    • Non, car debug ne permet pas de sauvegarder les modifications effectuées dans le programme. Par conséquent, lorsque l'on quitte debug, le programme revient à son état initial.

Registres


  • Exécuter la commande r sous DEBUG
  1. Quelles sont les informations affichées par cette commande ?
  2. Correction
    • Lorsqu'on exécute la commande r sous DEBUG dans DOSBox, elle affiche les informations relatives aux registres du processeur et les états de flags (indicateurs).
  3. Décrivez les registres et les indicateurs que vous connaissez.
  4. Correction
    • Les registres :
    • Registre  Description
      --------  ------------------------------------------------------------
      AX        Registre accumulateur. Utilisé pour les opérations arithmétiques et E/S.
      BX        Registre de base. Utilisé pour adresser les données en mémoire.
      CX        Registre compteur. Souvent utilisé pour les boucles et les décalages.
      DX        Registre de données. Utilisé pour les opérations E/S et les multiplications/divisions.
      
      SP        Pointeur de pile (Stack Pointer). Pointe vers le sommet de la pile.
      BP        Pointeur de base (Base Pointer). Utilisé pour accéder aux données dans la pile.
      SI        Index source (Source Index). Utilisé pour les opérations sur chaînes (adresse source).
      DI        Index destination (Destination Index). Utilisé pour les opérations sur chaînes (adresse destination).
      
      DS        Segment de données (Data Segment). Segment utilisé pour le stockage des données.
      ES        Segment supplémentaire (Extra Segment). Utilisé pour un stockage de données supplémentaire.
      SS        Segment de pile (Stack Segment). Segment utilisé pour les opérations sur la pile.
      CS        Segment de code (Code Segment). Segment contenant le code du programme.
      
      IP        Pointeur d'instruction (Instruction Pointer). Pointe vers la prochaine instruction à exécuter.
      
    • Les flags (indicateurs) :
    • Flag  Mnémonique       Signification
      ----  -----------      ------------------------------------------------------------
      NV    OV / NV          NV = Pas de dépassement (Overflow Flag désactivé).
                             OV = Dépassement arithmétique activé (Overflow Flag activé).
      
      UP    DN / UP          UP = Direction ascendante.
                             DN = Direction descendante pour les opérations sur chaînes.
      
      EI    EI / DI          EI = Interruptions activées (Interrupt Flag activé).
                             DI = Interruptions désactivées (Interrupt Flag désactivé).
      
      PL    PL / NG          PL = Résultat positif (Sign Flag désactivé).
                             NG = Résultat négatif (Sign Flag activé).
      
      NZ    Z / NZ           NZ = Résultat non zéro (Zero Flag désactivé).
                             Z  = Résultat zéro (Zero Flag activé).
      
      NA    AC / NA          NA = Pas de retenue auxiliaire.
                             AC = Retenue auxiliaire activée (Auxiliary Carry).
      
      PO    PE / PO          PO = Parité impaire (Parity Odd).
                             PE = Parité paire (Parity Even).
      
      NC    C / NC           NC = Pas de retenue (No Carry), aucun emprunt ou dépassement.
                             C  = Retenue activée (Carry Flag), emprunt ou dépassement.
      
  5. Avec la commande a, saisissez les instructions suivantes à partir de l’adresse 100h
  6.                               MOV AX,FFFF
                                  MOV AH,5
                                  MOV BH,6
                                  MOV AL,BH   
              
    Correction
    • Lancez la commande a 0100 dans le débogueur DOSBox pour entrer les instructions à partir de l'offset 0100:
    • a 0100
      073F:0100 MOV AX, FFFF
      073F:0103 MOV AH, 5
      073F:0105 MOV BH, 6
      073F:0107 MOV AL, BH
      
  7. Exécutez les commandes pas à pas et relever à chaque fois l'état des registres concernés. Expliquez l'effet de chaque commande.
  8. Correction
    • Lancez la commande p dans le débogueur DOSBox pour exécutez les commandes pas à pas à partir de l'adresse IP:
    • p
      p
      p 
      p
      
    • Après avoir exécuté la première p, nous observons que la valeur de AX est passée à FFFF. Nous observons également que l'IP pointe vers l'instruction suivante.
    • Selon les indicateurs, nous avons les indicateurs PL et NZ qui signifient que la valeur du registre est une valeur positive non nulle. Nous trouvons également PO qui indique que la valeur est impaire (FFFF = 255).
    • Ensuite, le deuxième p, la valeur de AH passe à 05 sans que les flags ne soient modifiés.
    • L'adresse du registre IP devient l'adresse de l'instruction suivante.
    • Par suite, le troisième p, la valeur de BH passe à 06 sans que les flags ne soient modifiés.
    • L'adresse du registre IP devient l'adresse de l'instruction suivante.
    • Enfin, le quatrième p, la valeur de AL passe à la valeur de BH sans que les flags ne soient modifiés.
  9. Avec la commande r affectez à IP la valeur 100h et exécuter la commande t. Que se passe-t-il ? Pourquoi ?
  10. Correction
    • L'adresse du registre IP devient 0100 et la commande t exécute les instructions comme précédemment.
  11. Saisissez les instructions suivantes :
                                  MOV AX,FFFF
                                  MOV BX,FFFF
                                  ADD AX,BX
                                  MOV AX,0001
                                  DEC AX
                                  INC AX
                                  SUB AX,0002
                                  MOV AH,70
                                  MOV BH,50
                                  ADD AH,BH   
              
    Exécutez les pas à pas et relevez les valeurs des indicateurs et expliquez les changements.
  12. Correction
      Instruction           Flags                  Explication des Changements
      --------------------  ------------------------  --------------------------------------------------------------
      MOV AX, FFFF          NV UP EI PL NZ NA PO NC   Aucun changement, car MOV ne modifie pas les Flags.
      
      MOV BX, FFFF          NV UP EI PL NZ NA PO NC   Aucun changement, car MOV ne modifie pas les Flags.
      
      ADD AX, BX            NV UP EI NG NZ AC PO CY   CY (Carry Flag) activé à cause d'un dépassement de 16 bits.
                                                      NG (Sign Flag) activé car le résultat est négatif.
                                                      AC (Auxiliary Carry) activé à cause d'une retenue entre bits 3 et 4.
                                                      PO (Parity Odd) car la parité est impaire.
      
      MOV AX, 0001          NV UP EI PL NZ NA PO CY   Les flags sont réinitialisés par MOV dans dosbox debug sauf pour le flag CY.
      
      DEC AX                NV UP EI PL Z  NA PE CY   Z (Zero Flag) activé car le résultat est zéro.
                                                      PE (Parity Even) activé car la parité est paire.
      
      INC AX                NV UP EI PL NZ NA PO CY   NZ (Zero Flag) désactivé car le résultat est non nul.
                                                      PO (Parity Odd) car la parité est impaire.
      
      SUB AX, 0002          NV UP EI NG NZ AC PE CY   CY (Carry Flag) activé à cause d'un emprunt.
                                                      NG (Sign Flag) activé car le résultat est négatif.
                                                      AC (Auxiliary Carry) activé en raison de l'emprunt.
                                                      PE (Parity Even) activé car la parité est paire.
      
      MOV AH, 70            NV UP EI NG NZ AC PE CY   Aucun changement, car MOV ne modifie pas les Flags.
      
      MOV BH, 50            NV UP EI NG NZ AC PE CY   Aucun changement, car MOV ne modifie pas les Flags.
      
      ADD AH, BH            OV UP EI NG NZ NA PE NC   OV (Overflow Flag) activé car dépassement en arithmétique signée.
                                                      NG (Sign Flag) activé car le résultat est négatif.
                                                      PE (Parity Even) activé car la parité est paire.
                                                      NC (No Carry) car il n'y a pas de retenue au-delà du bit 7.
      

Création d'un programme avec DEBUG


  1. Saisissez les instructions suivantes à partir de l’offset 100h
                                  MOV DX,10B
                                  MOV AH,9
                                  INT 21
                                  MOV AH,4C
                                  INT 21
                                  DB "Mon premier programme avec DEBUG",0D,0A,'$'
    
  2. Correction
    • Lancez la commande a 0100 dans le débogueur DOSBox pour entrer les instructions à partir de l'offset 0100:
    • a 0100
      073F:0100 MOV DX,10B
      073F:0103 MOV AH,9
      073F:0105 INT 21
      073F:0107 MOV AH,4C
      073F:0109 INT 21
      073F:010B DB "Mon premier programme avec DEBUG",0D,0A,'$'
      073F:012E
      

      Remarque :

    • Dans DEBUG, les nombres comme 10B sont supposés être hexadécimaux par convention, sauf s'ils sont explicitement indiqués comme binaires (suffixe b) ou décimaux. Exemple: 10b : nombre binaire, 10B : nombre hexadécimal, 10: nombre décimal
  3. Enregistrer le programme crée sous le nom ARCHI01.COM. (Pour enregistre ce programme, mettez dans CX le nombre d’octets qu’il occupe, utilisez n pour nommer le fichier puis la commande w pour l’écrire sur le disque)
  4. Conseils
    • Après avoir écrit les instructions, utilisez la commande -r CX pour ajouter la taille du programme.
    • Pour calculer la taille d'un programme, vous pouvez utiliser la formule suivante : DÉBUT - FIN
      Par exemple, si vous commencez l'assemblage à 0100h et que vous le terminez à 012Eh, la taille du programme est : 012E - 0100 = 002E, ce qui équivaut à 46 octets.
    Correction
    • A partir de DEBUG, nous observons que le programme se termine par 012E. La taille du programme est donc : 012E - 0100 = 002E.
    • Lancez la commande r CX dans le débogueur DOSBox puis 002E pour entrer la taille du programme:
    • r CX
      CX: 002E
      
    • Exécutez ensuite la commande n ARCHI01.COM pour nommer le programme ARCHI01 puis w pour écrire le programme en mémoire.
    • n ARCHI01.COM
      w 
      
  5. Quitter DEBUG et exécutez ARCHI01.COM.
  6. Conseils
    • Pour quitter DEBUG lancez la commande q.
    • Pour exécuter un programme il suffit de tapez le nom de programme sans extension. Exemple: PROGRAMME1
    Correction
    • Lancez la commande q pour quitter DEBUG.
    • Puis lancez la commande ARCHI01 pour exécuter le programme ARCHI01.exe.
    • q
      ARCHI01
      
  7. Que fait ce programme ?
  8. Correction
    • Le programme affiche le message "Mon premier programme avec DEBUG"
  9. Quel est le rôle de la première instruction ?
  10. Correction
    • La première instruction charge l'adresse 0010Bh dans le registre DX. Cette adresse pointe sur la chaîne qui contient le message « Mon premier programme avec DEBUG ».
    • Nous avons choisi l'adresse 10Bh parce que :
    • En mode DEBUG, lorsque vous utilisez la commande a 100, l’assemblage commence toujours à l’adresse 100h. Les instructions saisies sont converties en code machine et placées séquentiellement en mémoire, sans laisser d’espace vide. Chaque instruction occupe une certaine taille en mémoire : par exemple, MOV DX, 10B occupe 3 octets, MOV AH, 9 occupe 2 octets, etc. Si nous additionnons les tailles des instructions dans le programme, elles occupent les adresses de 100h à 10Ah. DEBUG place automatiquement la chaîne de caractères (avec la directive DB) à la première adresse libre, qui est 10Bh dans ce cas. Ainsi, la chaîne est positionnée juste après les instructions, car DEBUG suit toujours cet ordre séquentiel.
    • En Resumé :

    • Le message se trouve dans l'adresse 10Bh à partir de l'adresse donnée par debug :
  11. L’interruption 21h exécute la fonctions DOS dont le numéro est placé dans AH. Expliquez alors l’effet des autres instructions.
  12. Correction
      Instruction           Effet                                                     Rôle dans le programme
      --------------------  -------------------------------------------------------   ---------------------------------------------------------
      MOV DX, 10B           Charge l’adresse 10Bh dans le registre DX.                Prépare l’adresse où est stockée 
                                                                                      la chaîne pour l’affichage.
                                                                                      DOS utilise cette adresse pour afficher la chaîne.
      
      MOV AH, 9             Place le numéro de la fonction DOS 9 dans AH.             Spécifie la fonction DOS "Afficher une chaîne" 
                                                                                      (Display String).
                                                                                      DOS attend que l’adresse de la chaîne soit dans DX.
      
      INT 21                Appelle l’interruption DOS 21h.                           Affiche la chaîne à l’écran en utilisant la 
                                                                                      fonction 9 et l’adresse de DX.
      
      MOV AH, 4C            Place le numéro de la fonction DOS 4C dans AH.            Spécifie la fonction DOS "Terminer le programme"
                                                                                      (Terminate Program).
      
      INT 21                Appelle l’interruption DOS 21h.                           Quitte le programme proprement et retourne au système DOS.
      
      DB "Mon premier..."   Définit une chaîne de caractères suivie de 0D, 0A et $.   La chaîne à afficher : "Mon premier programme avec DEBUG".
                                                                                      0D, 0A = Retour à la ligne, $ = Fin de chaîne pour DOS.
      

Débuggage et désassemblage


  1. Copier le programme ARCHI02.EXE dans votre répertoire de travail (C:\TASM 1.4\TASM), et exécutez-le. Que fait ce programme ?
  2. Indicaton
    • Pour exécutez le programme, entrer ARCHI02.EXE ou ARCHI02
    Correction
    • Nous observons le texte « Mon premier programme en assembleur »
  3. Entrez en mode DEBUG en exécutant la commande DEBUG ARCHI02.EXE. Exécutez le programme avec la commande g. Que remarquez-vous ?
  4. Correction
    • Nous observons le texte « Mon premier programme en assembleur », puis le programme se termine.
  5. Sachant que IP est positionné à la première instruction de ce programme, quelle est l’adresse de cette instruction?

    La dernière instruction de ce programme est celle qui permet de revenir sous DOS. Relever l’adresse de celle-ci.

    Relever ensuite les instructions composant ce programme, et analyser les.
  6. Indication
    • Afficher les registres à l'aide de la commande r.
    • Utilisez la commande u (IP ADDRESSE) pour voir les instructions d'assemblage du programme et leur position en mémoire.
    Correction
    • Exécutez la commande r pour relevez le registre IP :
    • r
    • D'après DOSBOX, on remarque que la valeur du registre IP est: 0000
    • C'est à dire que le programme exécutera à partir de l'offset 0000
    • Exécutez la commande u 0000 pour afficher les instructions et leur position en mémoire :
    • u 0000
    • Donc, l'adresse de la dernière instruction qui permet de revenir sous DOS est: 076E:000C
    • 076E:0000 B86F07      MOV AX, 076F      ; Charge la valeur 076Fh dans AX (adresse du segment où se trouve les données)
      076E:0003 8ED8        MOV DS, AX        ; Définit DS (Segment de Données) à la valeur de AX, pointant DS vers le segment 076Fh
      076E:0005 BA0000      MOV DX, 0000      ; Charge la valeur 0000h dans DX (le décalage de la chaîne à afficher)
      076E:0008 B409        MOV AH, 09        ; Charge la valeur 09h dans AH (fonction 09h de INT 21h pour afficher une chaîne)
      076E:000A CD21        INT 21            ; Appelle l'interruption DOS 21h pour exécuter la fonction spécifiée (affichage de la chaîne)
      076E:000C B44C        MOV AH, 4C        ; Charge la valeur 4Ch dans AH (fonction 4Ch de INT 21h pour terminer le programme)
      076E:000E CD21        INT 21            ; Appelle l'interruption DOS 21h pour terminer l'exécution du programme
      
  7. Où se trouve la chaîne affichée par le programme ? Retrouvez l’adresse en mémoire de cette chaîne.
    A quoi correspond le segment de l’adresse trouvée ?
  8. Correction
    • D'après l'exercice précédent, le segment de données est le segment 076F et le chaîne de caractères dans l'offset 0000. Donc l'adresse complète du chaîne est 076F:0000.
    • Nous pouvons le vérifier en exécutant la commande d 076F:0000.
  9. Changer le message affiché par le programme en " Ce programme est modifie directement en memoire "
    Exécutez le programme pour vérifier votre changement.
  10. Correction
    • Nous savons que la chaîne se trouve à l'adresse 076F:0000, nous pouvons donc modifier cette chaîne en la réécrivant à partir de la même adresse en utilisant la commande e :
    • e 076F:0000 "Ce programme est modifie directement en memoire",'$'
    • Pour exécuter le programme exécutez la commande g :