LA COMMANDE DEBUG

Commande externe. Fonctionne sur la ligne de commande ou dans un batch.

L'utilitaire Debug permet officiellement de deboger un programme (de le mettre au point), mais surtout il offre l'opportunite de faire ses premieres armes en assembleur (un cours est prevu, patience...). De plus il est encore present dans windows 95...(mais avec une aide ridicule).

Syntaxe

DEBUG [[lecteur:][chemin]fichier [param]]

Parametres

[lecteur:][chemin]fichier

Precisent l'emplacement et le nom du fichier executable a tester.

param

Precise toute information, a inclure dans la ligne de commande, necessaire au fichier executable que vous voulez tester.

Si vous utilisez la commande DEBUG sans preciser aucun emplacement ou nom de fichier, vous devez taper toutes les commandes a la suite de l'invite de Debug (un tiret).

Description des commandes de DEBUG

? [Affiche une liste des commandes de Debug]

A [Assemble des mnemoniques 8086/8087/8088 (marche aussi pour processeur 32 bits)]

C [Compare deux zones de la memoire]

D [Affiche le contenu d'une zone de la memoire]

E [Entre des donnees en memoire a partir d'une adresse donnee]

F [Remplit une zone de memoire avec des valeurs donnees]

G [Execute le fichier executable charge en memoire]

H [Realise des operations arithmetiques sur des valeurs hexadecimales]

I [Affiche la valeur d'un octet d'un port donne]

L [Charge en memoire un fichier ou des secteurs de disque]

M [Copie le contenu d'un bloc de memoire]

N [Specifie un nom de fichier pour les commandes L et W ou specifie les parametres pour le fichier mis au point]

O [Envoie la valeur d'un octet vers un port de sortie]

P [Execute une boucle, une instruction sur chaine repetee, une interruption logicielle ou une sous routine]

Q [Quitte Debug]

R [Affiche ou modifie le contenu d'un ou plusieurs registres]

S [Recherche, dans une zone de memoire, une sequence d'octets donnee]

T [Execute une instruction puis affiche le contenu de tous les registres, l'etat de tous les indicateurs et la forme decodee de l'instruction que Debug executera ensuite]

U [Desassemble des octets et affiche les instructions source correspondantes]

W [Ecrit le fichier en cours de mise au point sur disque]

XA [Alloue de la memoire paginee]

XD [Desactive l'allocation d'un descripteur de memoire paginee]

XM [Affecte des pages logiques aux pages physiques de la memoire paginee]

XS [Affiche des informations sur l'etat de la memoire paginee]

 

Resume des commandes reconnues par Debug et syntaxe

MNEMONIQUE
SYNTAXE

assemble (assembler)

A [adresse]

compare (comparer)

C plage adresse

dump (lister)

D [plage]

enter (entrer)

E adresse [liste]

fill (remplir)

F plage liste

go (executer)

G [=adresse] [adresses]

hex (hexadecimal)

H valeur1 valeur2

input (entrer depuis un port)

I port

load (charger)

L [adresse] [lecteur] [secteur] [nombre]

move (deplacer)

M plage adresse

name (designer)

N [nchemin] [listearg]

output (envoyer sur port)

O port val

proceed (avancer)

P [=adresse] [nbre]

quit (quitter)

Q

register (registre)

R [registre]

search (rechercher)

S plage liste

trace (tracer)

T [=adresse] [valeur]

unassemble (desassembler)

U [plage]

write (ecrire)

W [adresse] [lecteur] [secteur] [nombre]

allocate expanded memory (allouer EMS)

XA [#pages]

deallocate expanded memory (desallouer EMS)

XD [desc]

map expanded memory pages (affecter)

XM [pageL] [pageP] [desc]

display expanded memory status (etat EMS)

XS

help debug (aide en ligne de Debug)

?

Separation des parametres d'une commande

Toutes les commandes de Debug acceptent des parametres, a l'exception de la commande Q. Vous pouvez separer les parametres par des virgules ou des espaces mais ces separateurs ne sont requis qu'entre deux valeurs hexadecimales. En consequence, les commandes suivantes sont equivalentes:

dcs:100 110

d cs:100 110

d,cs:100,110

Adresses valides

Dans une commande de Debug, le parametre adresse specifie un emplacement en memoire. L'adresse est une designation en deux parties contenant d'une part un nom de registre de segment ou une adresse de segment sur quatre chiffres, d'autre part une valeur de decalage. Le nom ou l'adresse du segment sont facultatifs. Le segment par defaut pour les commandes A, G, L, T, U et W est CS. La valeur par defaut pour les autres commandes est DS. Toutes les valeurs numeriques sont en format hexadecimal.

Exemples d'adresses valides

CS:0100

04BA:0100

Les deux points (:) entre le nom de segment et la valeur de deplacement sont requis.

Plages valides

Dans une commande de Debug, le parametre plage specifie une plage de memoire. Vous avez le choix entre deux formats: une adresse de debut et une adresse de fin, ou bien une adresse de debut et la longueur (indiquee par L) de la plage.

Par exemple, les deux syntaxes suivantes specifient la plage de 16 octets qui commence a l'adresse CS:100:

cs:100 10f

cs:100 l 10

A (Assemble) Retour en haut

Assemble les mnemoniques 8086/8087/8088 directement en memoire. Fonctionne egalement pour les processeur 32 bits.

Cette commande cree du code machine executable a partir d'instructions en langage assembleur. Toutes les valeurs numeriques sont en format hexadecimal et vous devez les taper sous la forme d'une serie de 1 a 4 caracteres. Specifiez le prefixe mnemonique avant le code operatoire (opcode) auquel il fait reference.

Syntaxe

A [adresse]

Parametres

adresse

Specifie l'emplacement ou vous tapez les mnemoniques du langage assembleur. Utilisez une valeur hexadecimale en tant qu'adresse et tapez chaque valeur sans le caractere "h" final. Si vous ne precisez pas d'adresse, la commande A commence l'assemblage a l'adresse a laquelle elle s'est arretee lors de son utilisation precedente.

Remarques

Utilisation des mnemoniques

Les mnemoniques de specification de segment sont CS:, DS:, ES: et SS:. Le mnemonique de Retour eloigne (far) est RETF. Les mnemoniques de manipulation de chaine doivent specifier explicitement la taille de la chaine. Par exemple, utilisez MOVSW pour deplacer des chaines de mots (16 bits) et MOVSB pour deplacer des chaines d'octets (8 bits).

Assemblage de branchements et d'appels

L'assembleur assemble automatiquement un branchement ou un appel court (short), proche (near) ou eloigne (far) selon le deplacement d'octets vers l'adresse de destination. Vous pouvez utiliser un prefixe NEAR ou FAR pour imposer le type de branchement ou d'appel, comme illustre ci-apres:

-a0100:0500

0100:0500 jmp 502 ; branchement court de 2 octets

0100:0502 jmp near 505 ; branchement proche de 3 octets

0100:0505 jmp far 50a ; branchement eloigne de 5 octets

Le prefixe NEAR peut etre abrege en NE.

Distinction entre les adresses de mots et d'octets

Lorsqu'un operande peut faire reference a une adresse de mot ou d'octet, vous devez explicitement preciser le type de donnees par l'un des prefixes WORD PTR ou BYTE PTR. Les abreviations acceptees sont respectivement WO et BY. L'exemple suivant illustre ces deux formats:

ec wo [si]

neg byte ptr [128]

Specification des operandes

Debug utilise la convention usuelle indiquant qu'un operande entre crochets fait reference a l'adresse memoire. La raison en est que Debug ne peut distinguer un operande immediat d'un operande faisant reference a une adresse memoire. L'exemple suivant illustre ces deux formats:

mov ax,21 ; charge AX avec la valeur 21h

mov ax,[21] ; charge AX avec le contenu de l'adresse memoire 21h

Utilisation de pseudo-instructions

Deux pseudo-instructions sont disponibles avec la commande A, les codes operatoires DB et DW, qui effectuent respectivement l'assemblage d'octets et de mots directement en memoire. Voici quelques exemples de ces pseudo-instructions:

db 1,2,3,4,"VOICI UN EXEMPLE"

db "CECI EST UNE ETOILE: *"

db "CECI EST UNE APOSTROPHE: '"

dw 1000,2000,3000,"BACH"

Exemple

La commande A reconnait toutes les formes de commandes portant sur des registres de facon indirecte. Par exemple:

add bx,34[bp+2].[si-1]

pop [bp+di]

push [si]

Tous les codes operatoires synonymes sont egalement acceptes, comme illustre dans l'exemple suivant:

loopz 100

loope 100

ja 200

jnbe 200

Pour les codes operatoires de 8087, les prefixes WAIT et FWAIT doivent etre specifies, comme illustre dans les exemples suivants:

fwait fadd st,st(3) ; cette ligne assemble un prefixe fwait

 

C (Compare) Retour en haut

Compare deux zones de la memoire.

Syntaxe

C plage adresse

Parametres

plage

Specifie les adresses de debut et de fin, ou l'adresse de debut et la longueur de la premiere zone de memoire a comparer.

adresse

Precise l'adresse de debut de la deuxieme zone de memoire a comparer.

Remarques

Si les deux parties de memoire definies par plage et adresse sont identiques, Debug n'affiche rien et vous renvoie directement a l'invite de Debug. S'il existe des differences, Debug les affiche selon le format suivant:

adresse1 octet1 octet2 adresse2

Exemple

Les deux commandes suivantes ont le meme effet: c100,10f 300 ou c100l10 300 Chacune compare le bloc de memoire s'etendant de 100h a 10Fh a celui s'etendant de 300h a 30Fh. Debug repond dans les deux cas avec un listing similaire a celui-ci (en supposant que DS = 197F):

197F:0100 4D E4 197F:0300

197F:0101 67 99 197F:0301

197F:0102 A3 27 197F:0302

197F:0103 35 F3 197F:0303

197F:0104 97 BD 197F:0304

197F:0105 04 35 197F:0305

197F:0107 76 71 197F:0307

197F:0108 E6 11 197F:0308

197F:0109 19 2C 197F:0309

197F:010A 80 0A 197F:030A

197F:010B 36 7F 197F:030B

197F:010C BE 22 197F:030C

197F:010D 83 93 197F:030D

197F:010E 49 77 197F:030E

197F:010F 4F 8A 197F:030F

Notez que les adresses 197F:0106 et 197F:0306 ne sont pas dans la liste. Cela signifie que les valeurs contenues a ces adresses sont identiques.

 

D (Dump) Retour en haut

Affiche le contenu d'une plage d'adresses memoire.

Syntaxe

D [plage]

Parametre

plage

Specifie les adresses de debut et de fin, ou l'adresse de debut et la longueur de la zone memoire a afficher.

Remarques

Lorsque vous utilisez la commande D, Debug affiche le contenu de la memoire en deux parties: l'une au format hexadecimal (chaque octet est represente dans ce format), l'autre au format texte ASCII (les octets sont affiches sous forme de caracteres ASCII). Chaque caractere non imprimable est affiche sous la forme d'un point (.) dans la partie ASCII de l'affichage. Chaque ligne permet d'afficher le contenu de 16 octets avec un tiret entre le 8eme et le 9eme octet. Chaque ligne affichee commence par un octet d'adresse multiple de 16.

Exemple

Si vous tapez la commande: dcs:100 10f Debug affiche le contenu de la memoire sous le format:

04BA:0100 54 4F 4D 00 53 41 57 59-45 52 00 00 00 00 00 00

TOM.SAWYER......

Si vous tapez la commande D sans parametre, l'affichage se presente comme ci dessus. Chaque ligne commence par une adresse dont la valeur est de 16 octets de plus que l'adresse precedente (ou de huit octets si vous avez un ecran de 40 colonnes). Pour chaque commande D suivante tapee sans parametre, Debug affiche les octets qui suivent immediatement les derniers octets affiches par la commande precedente.

Si vous tapez la commande suivante, Debug affiche le contenu de 20h octets en commencant a l'adresse CS:100:

dcs:100 l 20

Si vous tapez la commande suivante, tous les octets dans la plage d'adresse de 100h a 115h du segment CS sont affiches:

dcs:100 115

 

E (Enter) Retour en haut

Permet d'entrer des donnees en memoire a l'adresse specifiee.

Vous pouvez taper des donnees en format hexadecimal ou ASCII. Toute donnee precedemment stockee a l'adresse specifiee est perdue.

Syntaxe

E adresse [liste]

Parametres

adresse

Specifie la premiere adresse en memoire a laquelle vous voulez placer les donnees.

liste

Specifie les donnees que vous voulez placer dans les octets successifs de la memoire.

Remarques

Utilisation du parametre adresse

Si vous entrez une valeur pour adresse et pas de valeur pour le parametre liste facultatif, Debug affiche l'adresse et son contenu, reaffiche l'adresse sur la ligne suivante et attend votre entree. Vous pouvez alors realiser l'une des actions suivantes:

Remplacer la valeur d'octet par une autre. Pour cela, tapez la valeur souhaitee apres la valeur courante. Si vous n'entrez pas une valeur hexadecimale valide ou si elle a plus de deux chiffres, le caractere non valide ou excedentaire ne recoit pas d'echo.

Passer a l'octet suivant. Pour cela, appuyez sur la touche ESPACE. Pour changer la valeur dans cet octet, tapez la nouvelle valeur apres la valeur en cours. Si vous avancez de plus de 8 octets avec la touche ESPACE, Debug affiche une nouvelle ligne et une nouvelle adresse au debut de celle-ci.

Passer a l'octet precedent. Pour cela, tapez un TIRET. Repetez l'operation pour reculer de plusieurs octets. Lorsque vous tapez un TIRET, Debug affiche une nouvelle ligne, l'adresse en cours et la valeur de l'octet.

Arreter la commande E. Pour cela, appuyez sur ENTREE. Vous pouvez utiliser cette touche a tout moment.

Utilisation du parametre liste

Si vous precisez des valeurs pour le parametre liste, la commande E utilise sequentiellement ces valeurs pour remplacer les valeurs existantes. Si une erreur est detectee, aucune valeur n'est remplacee. Les valeurs de liste peuvent etre des valeurs hexadecimales d'octets ou des chaines. Vous devez les separer par un espace, une virgule ou un caractere de tabulation. Vous devez egalement placer les chaines entre apostrophes ou entre guillemets.

Exemple

Supposons que vous tapiez la commande suivante: ecs:100 Debug affiche le contenu du premier octet dans le format suivant:

04BA:0100 EB._

Pour attribuer a cet octet la valeur 41, tapez 41 au niveau du curseur, comme suit:

04BA:0100 EB.41_

Vous pouvez taper des valeurs d'octet consecutives au moyen de la commande E. Pour passer aux octets suivants, appuyez sur la touche ESPACE plutot que sur ENTREE. Debug affiche la valeur suivante. Dans cet exemple, si vous appuyez trois fois sur la touche ESPACE, Debug affiche les valeurs suivantes:

04BA:0100 EB.41 10. 00. BC._

Pour attribuer a la valeur hexadecimale BC la valeur 42, tapez simplement 42 au niveau du curseur, comme suit:

04BA:0100 EB.41 10. 00. BC.42_

Supposons maintenant que vous souhaitiez modifier la valeur 10 en 6F. Pour cela, tapez deux fois le TIRET jusqu'a ce que l'adresse 0101 soit affichee (valeur 10). Debug affiche:

04BA:0100 EB.41 10. 00. BC.42-

04BA:0102 00.-

04BA:0101 10._

Tapez 6f au niveau du curseur pour changer la valeur:

04BA:0101 10.6f_

Appuyez sur la touche ENTREE pour arreter la commande E et revenir a l'invite Debug. L'exemple suivant illustre l'entree d'une chaine:

eds:100 "Ceci est un exemple de texte" Cette chaine occupera 28 octets a partir de DS:100.

 

F (Fill) Retour en haut

Remplit une zone de memoire specifiee avec les valeurs que vous precisez.

Vous pouvez specifier des donnees en format hexadecimal ou ASCII. Toute donnee precedemment stockee a l'adresse specifiee est perdue.

Syntaxe

F plage liste

Parametres

plage

Specifie les adresses de debut et de fin, ou l'adresse de debut et la longueur de la zone a remplir.

liste

Specifie les donnees a entrer. Le parametre liste peut se composer de nombres hexadecimaux ou d'une chaine entre guillemets.

Remarques

Utilisation du parametre plage

Si plage contient plus d'octets que le nombre de valeurs indique dans liste, la commande Debug repete les valeurs de liste jusqu'a ce que tous les octets de plage soient remplis. Si l'une des adresses memoire de plage n'est pas valide ou n'existe pas,Debug affiche un message d'erreur et arrete la commande F.

Utilisation du parametre liste

Si liste contient plus de valeurs que le nombre d'octets de plage, les valeurs de liste excedentaires sont ignorees.

Exemple

Si vous tapez la commande: f04ba:100l100 42 45 52 54 41

Debug modifie le contenu des adresses memoires 04BA:100 a 04BA:1FF au moyen des valeurs specifiees. Les cinq valeurs sont repetees jusqu'a ce que les 100h octets soient remplis.

 

G (Go) Retour en haut

Execute le programme charge en memoire.

Syntaxe

G [=adresse] [interruptions]

Parametres

=adresse

Specifie l'adresse a laquelle vous voulez executer la commande G. Si vous ne precisez pas d'adresse, le DOS commence l'execution du programme a l'adresse en cours dans les registres CS:IP.

interruptions

Specifie entre 1 et 10 points d'interruption temporaires pour la commande G.

Remarques

Utilisation du parametre adresse

Vous devez faire preceder le parametre adresse d'un signe egal (=) afin de distinguer l'adresse de debut (adresse) des points d'interruption (interruptions).

Specification des points d'interruption

Le programme arrete l'execution au premier point d'interruption rencontre, independamment de sa position dans la liste des interruptions. Debug remplace l'instruction d'origine de chaque point par un code d'interruption. Quand le programme atteint un point d'interruption, Debug restaure toutes les adresses de point d'interruption a leurs instructions d'origine, puis affiche le contenu de tous les registres, l'etat de tous les indicateurs et la forme decodee de la derniere instruction executee. Debug affiche les memes informations qu'avec la commande R (register) suivie de l'adresse du point d'interruption. Si vous n'arretez pas le programme a l'un des points d'interruption, les codes d'interruption ne sont pas remplaces par les instructions d'origine.

Limitations pour la definition des points d'interruption

Vous pouvez placer des points d'interruption uniquement aux adresses contenant le premier octet d'un code operatoire 8086. Si vous definissez plus de dix points d'interruption, Debug affiche le message d'erreur suivant: Erreur bp

Conditions requises pour le pointeur de la pile de l'utilisateur

Le pointeur de la pile de l'utilisateur doit etre valide et contenir au moins 6 octets pour la commande G. Cette commande utilise une instruction IRET pour provoquer un branchement dans le programme en cours de mise au point. Debug positionne le pointeur de la pile de l'utilisateur et place les indicateurs, le registre de segment de code et le pointeur d'instruction dans la pile. Une adresse de pile non valide ou trop petite peut provoquer un arret du systeme d'exploitation. Debug place le code d'interruption (0CCh) dans la ou les adresses de point d'interruption indiquees.

Relance d'un programme

N'essayez pas de relancer un programme lorsque le DOS affiche le message: Fin normale du programme. Vous devez recharger le programme avec les commandes N (name) et L (load) pour l'executer correctement.

Exemple

Si vous tapez: gcs:7550 Le DOS execute le programme en memoire jusqu'a l'adresse 7550 du segment CS. Debug affiche le contenu des registres et l'etat des indicateurs, apres quoi la commande G est terminee.

La commande suivante definit deux points d'interruption: gcs:7550, cs:8000 Si vous tapez a nouveau la commande G apres que Debug a rencontre un point d'interruption, l'execution demarre a l'instruction suivant le point d'interruption au lieu de demarrer a son adresse de debut habituelle.

 

H (Hex) Retour en haut

Effectue un calcul en notation hexadecimale sur les deux parametres specifies.

Syntaxe

H valeur1 valeur2

Parametres

valeur1

Ce parametre represente un nombre hexadecimal compris entre 0 et FFFFh.

valeur2

Ce parametre represente un second nombre hexadecimal compris entre 0 et FFFFh.

Remarques

Debug additionne les deux parametres, puis soustrait le second du premier et affiche le resultat du calcul sur une ligne: leur somme en premier, puis leur difference.

Exemple

Si vous tapez: h19f 10a Debug effectue les calculs et affiche le resultat suivant: 02A9 0095

 

I (Input) Retour en haut

Lit et affiche la valeur d'un octet venant du port specifie.

Syntaxe

I port

Parametre

port

Specifie l'adresse du port d'entree (toujours en hexadecimale). L'adresse peut etre codee sur 16 bits.

Exemple

Supposons que vous tapiez: i2f8

Supposons aussi que la valeur d'octets au port specifie soit 42h. Debug lit l'octet et affiche sa valeur sous la forme: 42

Voir egalement la commande O (ouput) qui envoie une valeur donnee a un port de sortie donnee.

 

L (Load) Retour en haut

Charge un fichier ou le contenu de secteurs de disque specifiques en memoire.

Pour charger le contenu du nombre d'octets precises dans les registres BX:CX d'un fichier sur disque, utilisez la syntaxe:

Syntaxe

L [adresse]

Pour contourner le systeme de fichiers du DOS et charger directement des secteurs specifiques, utilisez la syntaxe:

L adresse lecteur debut nombre

Parametres

adresse

Specifie l'adresse a laquelle vous voulez charger le fichier ou le contenu du secteur. Si vous ne specifiez pas d'adresse, Debug utilise l'adresse contenue dans le registre CS.

Lecteur

Specifie le lecteur qui contient la disquette sur laquelle les secteurs specifiques doivent etre lus. Cette valeur est numerique: 0 = A:, 1 = B:, 2 = C: et ainsi de suite. N'utilisez les parametres lecteur, nombre et debut que si vous voulez charger le contenu de secteurs specifiques plutot que le fichier specifie dans la ligne de commande de DEBUG ou dans la commande N (name) la plus recente.

debut

Specifie (en notation hexadecimale) le numero du premier secteur a charger.

nombre

Specifie (en notation hexadecimale) le nombre de secteurs consecutifs a charger.

Remarques

Utilisation de la commande L sans parametre

Si vous utilisez la commande L sans parametre, le fichier indique apres la commande DEBUG est charge en memoire a partir de l'adresse CS:100. Debug place dans les registres BX and CX le nombre d'octets charges. Si vous ne specifiez pas de fichier dans la ligne de commande DEBUG, le fichier charge est celui qu'indique la commande N (name) la plus recente.

Utilisation de la commande L avec le parametre adresse

Si vous utilisez la commande L avec le parametre adresse, Debug commence le chargement du fichier ou du contenu des secteurs specifies, a l'adresse indiquee.

Utilisation de la commande L avec tous les parametres

Si vous utilisez la commande L avec tous les parametres, Debug charge des secteurs specifiques au lieu d'un fichier.

Chargement du contenu de secteurs specifiques

Chaque secteur de la plage que vous specifiez est lu sur le lecteur. Debug commence le chargement a partir de debut et continue jusqu'a ce que le nombre de secteurs specifies par nombre soit charge.

Chargement d'un fichier .EXE

Debug ignore le parametre adresse pour les fichiers .EXE. Si vous specifiez un fichier .EXE, Debug le place a l'adresse de chargement precisee dans l'en-tete du fichier .EXE. L'en-tete est elimine du fichier .EXE avant le chargement en memoire. De ce fait, la taille d'un fichier .EXE sur disque differe de sa taille en memoire. Si vous voulez examiner un fichier .EXE complet, renommez-le en utilisant une autre extension.

Ouverture d'un fichier hex

Un fichier hexadecimal utilise le format hexadecimal d'Intel, decrit dans l'Encyclopedie de MS DOS (MS DOS Encyclopedia). Debug presume que les fichiers suivis de l'extension .HEX sont en format hexadecimal. Vous pouvez taper la commande L sans parametre pour charger un fichier hexadecimal commencant a l'adresse specifiee dans le fichier .HEX. Si la commande L tapee contient le parametre adresse, Debug ajoute l'adresse specifiee a celle trouvee dans le fichier hexadecimal pour determiner l'adresse de debut.

Exemple

Supposons que vous lancez Debug et tapez: nfile.com

Il suffit, pour charger FILE.COM., d'executer la commande L. Debug charge le fichier FILE.COM. et affiche l'invite de Debug. Supposons que vous vouliez ensuite charger en memoire, a partir de l'adresse 04BA:0100, le contenu de 109 (6Dh) secteurs du lecteur C: et en commencant par le secteur logique 15 (0Fh). Pour cela, tapez: l04ba:100 2 0f 6d

 

M (Move) Retour en haut

Deplace le contenu d'un bloc de memoire vers un autre bloc de memoire.

Syntaxe

M plage adresse

Parametres

plage

Specifie les adresses de debut et de fin, ou l'adresse de debut et la longueur de la zone memoire dont vous voulez copier le contenu.

adresse

Specifie l'adresse de debut de l'emplacement ou vous voulez copier le contenu de la plage.

Remarques

Effets de la copie sur les donnees existantes

Si aucune nouvelle donnee n'est ecrite dans les adresses du bloc en cours de copie, les donnees d'origine restent intactes. Toutefois, si le bloc de destination contient deja des donnees, comme dans le cas d'une copie avec recouvrement, ces donnees sont effacees. (Une copie avec recouvrement est une copie ou une partie du bloc destinataire recouvre une partie du bloc source).

Copie avec recouvrement

La commande M effectue des operations de copie avec recouvrement sans perdre les donnees aux adresses destinataires. Le contenu des adresses qui seront recouvertes est copie en premier. En consequence, si les donnees doivent etre copiees des adresses hautes vers des adresses plus basses, la copie commence a partir du bloc d'adresses source le plus bas et continue vers les adresses les plus hautes. En revanche, si les donnees doivent etre copiees des adresses basses vers des adresses plus hautes, la copie commence au bloc d'adresses le plus haut et continue vers les adresses les plus basses.

Exemple

Supposons que vous tapez: mcs:100 110 cs:500 Debug copie d'abord le contenu de l'adresse CS:110 en CS:510, puis celui de CS:10F en CS:50F, et ainsi de suite jusqu'a ce que le contenu de CS:100 soit copie en CS:500. Pour voir les resultats, vous pouvez utiliser la commande D (dump), en precisant l'adresse destinataire utilisee dans la commande M.

 

N (Name) Retour en haut

Specifie un nom de fichier pour une commande L (load) ou W (write), ou specifie des parametres pour le fichier executable en cours de mise au point.

Syntaxe

N [lecteur:][chemin]fichier

Pour specifier les parametres du fichier executable que vous mettez au point, utilisez la syntaxe:

N param

Pour effacer les specifications en cours, utilisez la syntaxe:

N

Parametres

[lecteur:][chemin]fichier

Specifie l'emplacement et le nom du fichier executable que vous voulez mettre au point.

param

Specifie les parametres et commutateurs du fichier executable a mettre au point.

Remarques

Les deux fonctions de la commande N

La commande N sert tout d'abord a specifier un fichier qui pourra etre utilise ulterieurement par une commande L (load) ou W (write). Si vous lancez Debug sans indiquer le fichier a mettre au point, vous devez taper la commande Nfichier avant d'utiliser la commande L (load) pour charger le fichier. Le nom du fichier est formate correctement pour un bloc de controle de fichier a l'adresse CS:5C. La deuxieme fonction de la commande N est de specifier des parametres et des commutateurs dans la ligne de commande, pour le fichier en cours de mise au point.

Zones de memoire

Quatre zones de la memoire peuvent etre attribuees par la commande N:

Emplacement de memoire
Contenu

CS:5C

Bloc de controle de fichier (FCB) pour fichier1

CS:6C

Bloc de controle de fichier (FCB) pour fichier2

CS:80

Longueur de la ligne de commande N (en caracteres)

CS:81

Debut de la ligne de commande N

Le premier nom de fichier specifie comme parametre de la commande N est place dans un bloc de controle de fichier (FCB; File Control Block) a l'adresse CS:5C. Si un deuxieme fichier est specifie, son nom est place dans un FCB a l'adresse CS:6C. Le nombre de caracteres tapes dans la ligne de commande N (le caractere N excepte) est stocke en CS:80. Les caracteres effectifs (N excepte) sont stockes a partir de l'adresse CS:81. Ils peuvent representer tout commutateur ou separateur accepte au niveau de l'invite du DOS.

Exemple

Supposons que vous avez lance Debug et charge le programme PROG.COM pour une mise au point, et que vous decidez par la suite de specifier deux parametres pour PROG.COM, puis d'executer le programme. Voici la sequence de commandes a employer:

debug prog.com

nparam1 param2

g

Dans ce cas, la commande G (go) execute le programme comme si vous aviez tape la sequence suivante a la suite de l'invite du DOS:

prog param1 param2

Le test et la mise au point d'un programme se font donc selon l'environnement normal d'execution du programme PROG.COM.

Dans la sequence de commandes qui suit, la premiere commande N specifie NOMFI1.EXE comme fichier a utiliser dans la commande L (load) suivante qui chargera ce fichier en memoire. La seconde commande N indique les parametres qui seront utilises lors du lancement du programme NOMFI1.EXE. Enfin, la commande G (go) execute NOMFI1.EXE, comme si vous aviez tape la sequence NOMFI1 NOMFI2.DAT NOMFI3.DAT au niveau de l'invite du DOS.

nnomfi1.exe

l

nnomfi2.dat nomfi3.dat

g

Notez que vous n'utilisez pas la commande L (load) apres la deuxieme forme de la commande N. Notez egalement que si vous utilisez maintenant la commande W (write), le DOS sauvegarde NOMFI1.EXE (en cours de mise au point) sous le nom NOMFI2.DAT. Pour eviter ce resultat, vous devez toujours executer la premiere forme de la commande N immediatement avant une commande L (load) ou W (write).

 

O (Output) Retour en haut

Envoie la valeur d'un octet vers un port de sortie.

Syntaxe

O port valeur

Parametres

port

Specifie le port de sortie par le biais d'une adresse (toujours en hexadecimale). L'adresse du port peut etre specifiee sur 16 bits.

valeur

Specifie la valeur de l'octet a envoyer au port.

Exemple

Pour envoyer l'octet de valeur 4Fh (valeur en decimale = 79) sur le port de sortie a l'adresse 2F8h (valeur en decimale = 760), tapez: o2f8 4f

Voir egalement la commande I (input) qui lit et affiche la valeur d'un port d'entree donnee.

 

P (Proceed) Retour en haut

Execute une boucle, une instruction sur chaine repetee, une interruption logicielle ou une sous routine, ou trace toute autre instruction.

Syntaxe

P [=adresse] [nombre]

Parametres

=adresse

Specifie l'adresse de la premiere instruction a executer. Si vous ne specifiez pas d'adresse, la valeur par defaut est l'adresse en cours specifiee dans les registres CS:IP.

nombre

Specifie le nombre d'instructions a executer avant de rendre le controle a Debug. La valeur par defaut est 1.

Remarques

Transfert du controle au programme en cours de mise au point

Lorsque la commande P transfere le controle de Debug au programme en cours de mise au point, ce programme s'execute sans interruption jusqu'a ce que la boucle, l'instruction sur chaine repetee, l'interruption logicielle ou une sous routine a l'adresse specifiee soit terminee, ou jusqu'a ce que le nombre specifie d'instructions machine ait ete execute. Le controle retourne alors a Debug.

Limitations du parametre adresse

Si le parametre adresse ne specifie pas de segment, Debug utilise le registre CS du programme en cours de mise au point. Si vous omettez le parametre, l'execution du programme commence a l'adresse specifiee par ses propres registres CS:IP. Vous devez faire preceder le parametre adresse d'un signe egal (=) pour le differencier du parametre nombre. Si l'instruction presente a l'adresse specifiee n'est pas une boucle, une instruction sur chaine repetee, une interruption logicielle ou une sous-routine, la commande P fonctionne comme la commande T (trace).

Messages affiches par la commande P

Une fois qu'une instruction a ete executee par P, Debug affiche le contenu des registres du programme, l'etat de ses indicateurs et la forme decodee de l'instruction suivante a executer.

ATTENTION: Vous ne pouvez pas utiliser la commande P pour suivre l'execution dans la memoire morte (ROM). Utilisez pour ce faire la commande T (trace).

Exemple

Supposons que le programme en cours de mise au point contienne une instruction CALL a l'adresse CS:143F. Pour executer la sous-routine qui est la destination de CALL et retourner ensuite le controle a Debug, tapez: p=143f Debug affiche le resultat sous la forme suivante:

AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=2246 ES=2246 SS=2246 CS=2246 IP=1443 NV UP EI PL NZ AC PO NC

2246:1442 7505 JNZ 144A

 

Q (Quit) Retour en haut

Quitte Debug sans enregistrer le fichier en cours de mise au point.

Lorsque vous avez tape Q, vous revenez au niveau de l'invite du DOS.

Syntaxe

Q (sans parametres)

 

R (Register) Retour en haut

Affiche ou modifie le contenu d'un ou de plusieurs registres du processeur.

Syntaxe

R [registre]

Pour afficher le contenu de tous les registres et de tous les indicateurs dans la zone de stockage de registres, utilisez la syntaxe:

R

Parametre

registre

Specifie le nom du registre dont vous voulez afficher le contenu.

Remarques

Utilisation de la commande R

Si vous specifiez un nom de registre, le DOS affiche la valeur 16 bits de ce registre en notation hexadecimale et affiche un signe deux points (:) comme invite. Si vous voulez modifier le contenu du registre, tapez une nouvelle valeur et appuyer sur ENTREE; sinon, appuyez simplement sur ENTREE pour retourner a l'invite de Debug.

Noms de registres valides

Liste des noms de registres acceptes: AX, BX, CX, DX, SP, BP, SI, DI, DS, ES, SS, CS, IP, PC et F. Les valeurs IP et PC font toutes deux reference au pointeur d'instruction.

Si vous specifiez un nom de registre autre que ceux figurant dans la liste ci dessus, le DOS affiche le message d'erreur:

Erreur br

Utilisation du caractere F comme registre

Si vous tapez le caractere F au lieu d'un nom de registre, Debug affiche l'etat en cours de chaque indicateur au moyen d'un code alphabetique de deux caracteres et affiche l'invite de Debug. Pour modifier l'etat d'un indicateur, tapez le code de deux lettres qui se trouve en regard du nom dans le tableau:

Nom de l'indicateur
Active
Desactive

Depassement de capacite

OV

NV

Direction

DN (decrement)

UP (increment)

Interruption

EI (active)

DI (inactive)

Signe

ZR

NZ

Report auxiliaire

AC

NA

Parite

PE (paire)

PO (impaire)

Report

CY

NC

Vous pouvez taper de nouvelles valeurs pour les indicateurs dans n'importe quel ordre. Il n'est pas necessaire de separer ces valeurs par des espaces. Pour arreter la commande R, il suffit d'appuyer sur la touche ENTREE. Tout indicateur pour lequel vous n'avez pas specifie de nouvelle valeur reste inchange.

Messages affiches avec la commande R

Si vous specifiez plusieurs valeurs pour un indicateur, Debug renvoie le message: Erreur df

Si vous tapez un code d'indicateur different de ceux indiques dans le tableau precedent, Debug renvoie le message: Erreur bf

Dans les deux cas, Debug ignore toutes les valeurs specifiees a la suite de l'entree non valide.

Valeurs par defaut pour Debug

Lors du demarrage de Debug, les registres de segment pointent vers la plus petite adresse de memoire libre. Le pointeur d'instruction a la valeur 0100h, tous les indicateurs sont initialises et les autres registres prennent la valeur zero, a l'exception de SP qui est defini a FFEEh.

Exemple

Pour visualiser le contenu de tous les registres, l'etat de tous les indicateurs et la forme decodee de l'instruction qui se trouve a l'adresse courante, tapez: r Si l'adresse courante est CS:11A par Exemple:, l'affichage se presente comme suit:

AX=0E00 BX=00FF CX=0007 DX=01FF SP=039D BP=0000 SI=005C DI=0000

DS=04BA ES=04BA SS=04BA CS=O4BA IP=011A NV UP DI NG NZ AC PE NC

04BA:011A CD21 INT 21

Pour ne visualiser que l'etat des indicateurs, tapez: rf

Debug affiche les informations dans le format suivant: NV UP DI NG NZ AC PE NC - _

Vous pouvez maintenant taper une ou plusieurs valeurs d'indicateur valides, dans un ordre quelconque, avec ou sans espace, comme dans la commande: nv up di ng nz ac pe nc - pleicy Debug arrete la commande R et affiche l'invite de Debug. Les commandes R et RF permettent d'afficher les modifications: NV UP EI PL NZ AC PE CY - _

Appuyez sur ENTREE pour retourner a l'invite de Debug.

 

S (Search) Retour en haut

Cherche une liste d'octets dans la plage d'adresses specifiee.

Syntaxe

S plage liste

Parametres

plage

Specifie les adresses de debut et de fin de la plage a examiner.

liste

Specifie la ou les valeur(s) d'octet ou de chaine a rechercher. Separez les octets par des espaces ou des virgules. Placez les valeurs de chaine entre guillemets.

Remarques

Si le parametre liste contient plus d'une valeur d'octet, Debug n'affiche que la premiere adresse ou la valeur d'octet est presente. Si ce parametre contient une seule valeur d'octet, Debug affiche toutes les adresses de la plage specifiee ou la valeur est presente.

Exemple

Supposons que vous vouliez trouver toutes les adresses de la plage CS:100 a CS:110 contenant la valeur 41. Pour cela, tapez: scs:100 110 41 Debug affiche les resultats dans le format suivant:

04BA:0104

04BA:010D

-

La commande suivante cherche la chaine "Ph" dans la plage CS:100 a CS:1A0: scs:100 1a0 "Ph"

 

T (Trace) Retour en haut

Execute une instruction et affiche le contenu de tous les registres, l'etat de tous les indicateurs et la forme decodee de l'instruction executee.

Syntaxe

T [=adresse] [nombre]

Parametres

=adresse

Specifie l'adresse a laquelle Debug doit commencer les instructions de tracage. Si vous omettez le parametre adresse, le tracage commence a l'adresse specifiee par les registres CS:IP du programme.

nombre

Specifie le nombre d'instructions a tracer. Cette valeur doit etre un nombre hexadecimal. La valeur par defaut est 1.

Remarques

Instructions de tracage en memoire morte (ROM)

La commande T utilise le mode trace materiel des microprocesseurs 8086 ou 8088. Par consequent, vous pouvez egalement tracer des instructions qui se trouvent en memoire morte (ROM).

Utilisation du parametre adresse

Vous devez faire preceder le parametre adresse du signe egal (=) pour le differencier du parametre nombre.

Exemple

Pour executer une instruction (indiquee par CS:IP) et afficher le contenu des registres, l'etat des indicateurs et la forme decodee de l'instruction, tapez: t Si la position de l'instruction dans le programme est 04BA:011A, Debug affiche les informations suivantes:

AX=0E00 BX=00FF CX=0007 DX=01FF SP=039D BP=0000 SI=005C DI=0000

DS=04BA ES=04BA SS=04BA CS=O4BA IP=011A NV UP DI NG NZ AC PE NC

04BA:011A CD21 INT 21

 

U (Unassemble) Retour en haut

Desassemble des octets et affiche les instructions source correspondantes, ainsi que les adresses et les valeurs des octets. Le code desassemble ressemble au listage d'un fichier d'assemblage (sans les commentaires helas).

Syntaxe

U [plage]

Pour desassembler 20h octets (le nombre par defaut) en commencant a la premiere adresse qui suit celle affichee par la commande U precedente, utilisez la syntaxe:

u

Parametre

plage

Specifie les adresses de debut et de fin du code a desassembler, ou l'adresse de debut et la longueur du code.

Exemple

Pour desassembler 16 (10h) octets a partir de l'adresse 04BA:0100, tapez: u04ba:100l10 Debug affiche les resultats dans le format suivant:

04BA:0100 206472 AND [SI+72],AH

04BA:0103 69 DB 69

04BA:0104 7665 JBE 016B

04BA:0106 207370 AND [BP+DI+70],DH

04BA:0109 65 DB 65

04BA:010A 63 DB 63

04BA:010B 69 DB 69

04BA:010C 66 DB 66

04BA:010D 69 DB 69

04BA:010E 63 DB 63

04BA:010F 61 DB 61

Pour n'afficher que les informations concernant les adresses specifiques 04BA:0100 a 04BA:0108, tapez: u04ba:0100 0108 Debug affiche:

04BA:0100 206472 AND [SI+72],AH

04BA:0103 69 DB 69

04BA:0104 7665 JBE 016B

04BA:0106 207370 AND [BP+DI+70],DH

 

W (Write) Retour en haut

Ecrit sur disque un fichier ou des secteurs specifiques.

Il faut avoir specifie le nom du fichier disque lors du lancement de Debug ou avec la commande N (name) la plus recente. Chacune de ces methodes permet de sauvegarder correctement le nom de fichier pour un bloc de controle de fichier a partir de l'adresse CS:5C. Pour ecrire dans un fichier disque le contenu du nombre d'octets specifie dans les registres BX:CX, utilisez la syntaxe:

Syntaxe

W [adresse]

Pour contourner le systeme de fichiers du DOS et ecrire directement des secteurs specifiques, utilisez la syntaxe:

W adresse lecteur debut nombre

ATTENTION: L'ecriture de secteurs specifiques est tres risquee, car ce processus court circuite le gestionnaire de fichiers du DOS. La structure des fichiers sur disque peut facilement etre endommagee si vous utilisez des valeurs incorrectes.

Parametres

adresse

Specifie l'adresse du debut du fichier ou de la partie de fichier que vous voulez ecrire sur disque. Si vous ne precisez pas d'adresse, Debug commence a partir de CS:100.

lecteur

Specifie le lecteur contenant le disque cible. Cette valeur est une valeur numerique: 0 = A:, 1 = B:, 2 = C: et ainsi de suite.

debut

Specifie, en format hexadecimal, le numero du premier secteur ou vous voulez que l'ecriture du fichier commence.

nombre

Specifie le nombre total de secteurs dans lesquels ecrire.

Remarques

Reinitialisation de BX:CX avant d'utiliser la commande W sans parametre

Si vous avez utilise une commande G (go), T (trace), P (proceed), ou R (register), vous devez reinitialiser les registres BX:CX avant d'utiliser la commande W sans parametre.

Ecriture sur disque d'un fichier modifie

Si vous modifiez un fichier sans changer son nom, sa longueur ou son adresse de debut, Debug peut encore ecrire correctement le fichier a son emplacement d'origine sur le disque.

Limitation de la commande W

Cette commande ne vous permet pas d'ecrire un fichier .EXE ou .HEX mais uniquement un fichier .COM.

Exemple

Supposons que vous vouliez ecrire le contenu de la memoire depuis l'adresse CS:100 sur la disquette presente dans le lecteur A:. Vous voulez ecrire 2Bh secteurs en commencant au secteur logique 37h de la disquette. Pour cela, tapez: wcs:100 1 37 2b Quand l'ecriture est terminee, Debug affiche l'invite.

 

XA (Allocate Expanded Memory) Retour en haut

Alloue le nombre specifie de pages de memoire paginee (EMS). Pour utiliser la memoire paginee, vous devez avoir installe un gestionnaire de memoire conforme a la version 4.0 de la norme de gestion de la memoire paginee LIM EMS (Lotus/Intel/Microsoft Expanded Memory Specification).

Syntaxe

XA [nombre]

Parametre

nombre

Specifie le nombre de pages de 16 Ko a allouer a la memoire paginee.

Remarques

Debug affiche un message pour indiquer le numero hexadecimal du descripteur cree, si le nombre de pages specifie est disponible, et un message d'erreur dans le cas contraire.

Exemple

Pour allouer 8 pages de memoire paginee, tapez: xa8

Si la commande est executee avec succes, Debug affiche un message similaire au suivant: Descripteur cree=0003

 

XD (Deallocate Expanded Memory) Retour en haut

Desactive l'allocation d'un descripteur a la memoire paginee.

Pour utiliser la memoire paginee, vous devez avoir installe un gestionnaire de memoire conforme a la version 4.0 de la norme de gestion de la memoire paginee LIM EMS (Lotus/Intel/Microsoft Expanded Memory Specification).

Syntaxe

XD [descripteur]

Parametre

Descripteur

Precise le descripteur dont vous voulez desactiver l'allocation.

Exemple

Pour desactiver l'allocation du descripteur 0003, tapez: xd 0003 Si la commande est executee avec succes, Debug affiche un message similaire au suivant: Descripteur 0003 desaffecte

 

XM (Map Expanded Memory Pages) Retour en haut

Affecte une page logique de memoire paginee, appartenant au descripteur specifie, a une page physique de memoire paginee. Pour utiliser la memoire paginee, vous devez avoir installe un gestionnaire de memoire conforme a la version 4.0 de la norme de gestion de la memoire paginee LIM EMS (Lotus/Intel/Microsoft Expanded Memory Specification).

Syntaxe

XM [lpage] [ppage] [descripteur]

Parametres

lpage

Specifie le numero de la page logique de memoire paginee que vous voulez allouer a la page physique ppage.

ppage

Specifie le numero de la page physique a laquelle lpage doit etre affecte.

descripteur

Precise le descripteur.

Exemple

Pour afficher la page logique 5 du descripteur 0003 de la memoire paginee a la page physique 2, tapez: xm 5 2 0003

Si l'operation est executee avec succes, Debug affiche le message suivant: Page logique 05 affectee a la page physique 02

 

XS (Display Expanded Memory Status) Retour en haut

Affiche des informations sur l'etat de la memoire paginee.

Pour utiliser la memoire paginee, vous devez avoir installe un gestionnaire de memoire conforme a la version 4.0 de la norme de gestion de la memoire paginee LIM EMS (Lotus/Intel/Microsoft Expanded Memory Specification).

Syntaxe

XS (sans parametre)

Remarques

Les informations affichees sont au format:

XX pages allouees au descripteur XX

Page physique XX = Segment de cadre XX

XX pages EMS allouees sur un total de XX

XX descripteurs EMS alloues sur un total de XX

Exemple

Pour afficher des informations sur la memoire paginee, tapez: xs. Debug affiche des informations dans le format:

0000 pages allouees au descripteur 0000

0002 pages allouees au descripteur 0001

Page physique 00 = Segment de cadre C000

Page physique 01 = Segment de cadre C400

Page physique 02 = Segment de cadre C800

Page physique 03 = Segment de cadre CC00

2 pages EMS allouees sur un total de 80

2 descripteurs EMS alloues sur un total de FF

 

Retour en haut

Retour au sommaire de la rubrique

Retour au debut