- 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
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
Windows
MacOS
Ubuntu
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
- 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
- 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)
- Relevez l'adresse du premier octet décodé (segment et offset). Nous appellerons le segment trouvé "segment de travail".
- Vous pouvez utiliser la commande u ou d.
- 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
- Relevez les 32 premiers octets décodés sous les trois formes cités en 1.
- 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...
- Remplissez de 00 le premier Ko du segment de travail.
- 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
- 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.
- Vous pouvez utiliser la commande e pour entrer des données en mémoire à partir d’une adresse donnée.
- 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
- Entrez le code:
B4 4C CD 21
à l'adresse 100h - A quelles instructions correspond ce code ?
Exécutez ce code. Que se passe-t-il ? Pourquoi ? - 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 :
- 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
- Pouvez-vous relire les caractères "SMI" introduits précédemment ? Pourquoi ?
- 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.
Conseil
Correction
Conseil
Correction
Correction
Correction
Conseil
Correction
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
Correction
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
Correction
Registres
- Exécuter la commande r sous DEBUG
- Quelles sont les informations affichées par cette commande ?
- 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).
- Décrivez les registres et les indicateurs que vous connaissez.
- Les registres :
- Les flags (indicateurs) :
- Avec la commande a, saisissez les instructions suivantes à partir de l’adresse 100h
- Lancez la commande a 0100 dans le débogueur DOSBox pour entrer les instructions à partir de l'offset 0100:
- Exécutez les commandes pas à pas et relever à chaque fois l'état des registres concernés. Expliquez l'effet de chaque commande.
- Lancez la commande p dans le débogueur DOSBox pour exécutez les commandes pas à pas à partir de l'adresse IP:
- 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.
- Avec la commande r affectez à IP la valeur 100h et exécuter la commande t. Que se passe-t-il ? Pourquoi ?
- L'adresse du registre IP devient 0100 et la commande t exécute les instructions comme précédemment.
- 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.
Correction
Correction
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.
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.
MOV AX,FFFF MOV AH,5 MOV BH,6 MOV AL,BH
Correction
a 0100 073F:0100 MOV AX, FFFF 073F:0103 MOV AH, 5 073F:0105 MOV BH, 6 073F:0107 MOV AL, BH
Correction
p p p p
Correction
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
- 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,'$'
- Lancez la commande a 0100 dans le débogueur DOSBox pour entrer les instructions à partir de l'offset 0100:
- 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
- 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)
- 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. - 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:
- Exécutez ensuite la commande n ARCHI01.COM pour nommer le programme ARCHI01 puis w pour écrire le programme en mémoire.
- Quitter DEBUG et exécutez ARCHI01.COM.
- Pour quitter DEBUG lancez la commande q.
- Pour exécuter un programme il suffit de tapez le nom de programme sans extension. Exemple: PROGRAMME1
- Lancez la commande q pour quitter DEBUG.
- Puis lancez la commande ARCHI01 pour exécuter le programme ARCHI01.exe.
- Que fait ce programme ?
- Le programme affiche le message "Mon premier programme avec DEBUG"
- Quel est le rôle de la première instruction ?
- 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.
- Le message se trouve dans l'adresse 10Bh à partir de l'adresse donnée par debug :
- L’interruption 21h exécute la fonctions DOS dont le numéro est placé dans AH. Expliquez alors l’effet des autres instructions.
Correction
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 :
Conseils
Correction
r CX CX: 002E
n ARCHI01.COM w
Conseils
Correction
q ARCHI01
Correction
Correction
En Resumé :
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
- Copier le programme ARCHI02.EXE dans votre répertoire de travail (C:\TASM 1.4\TASM), et exécutez-le. Que fait ce programme ?
- Pour exécutez le programme, entrer ARCHI02.EXE ou ARCHI02
- Nous observons le texte « Mon premier programme en assembleur »
- Entrez en mode DEBUG en exécutant la commande DEBUG ARCHI02.EXE. Exécutez le programme avec la commande g. Que remarquez-vous ?
- Nous observons le texte « Mon premier programme en assembleur », puis le programme se termine.
- 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. - 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.
- 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
- 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 ? - 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.
- Changer le message affiché par le programme en " Ce programme est modifie
directement en memoire "
Exécutez le programme pour vérifier votre changement. - 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 :
Indicaton
Correction
Correction
Indication
Correction
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