Nachdem Sie hoffentlich eingesehen haben, daß eine gesunde Mischung aus Assemblerkenntnissen und konkrete Vorstellungen über die interne Konzeption des Betriebssystems und Architektur des Mikroprozessors die wichtigsten Voraussetzungen für erfolgreiche DEBUG-Sitzungen sind, fragen Sie sich bestimmt, ob das nun alles war, was man mit DEBUG machen kann:
Riskante Maschinenprogramme ohne teuren Makroassembler zu schreiben. Nein, natürlich nicht. Da DEBUG eigentlich zur Fehleranalyse dient, gibt es eine ganze Reihe weiterer nützlicher Befehle, die wir bisher nicht verwendet haben. Lassen Sie uns die wichtigsten DEBUG-Kommandos kurz zusammenfassen:
Assemble
Syntax: A [Adresse]
Bedeutung: Assembliere ab »Adresse«. Geben Sie keinen Parameter an, beginnt DEBUG mit der Adresse, die dem Wert des Instruction-Pointers (IP) entspricht. Unmittelbar nach dem Aufruf steht IP auf 100h. Nach der Eingabe von A erwartet DEBUG Prozessoranweisungen.
Compare
Syntax: C Adresse1,Adresse2 Adresse3
Bedeutung: Vergleiche den Bereich ab »Adresse1« bis »Adresse2« mit dem Bereich ab »Adresse3« bis »Adresse3« plus »Adresse2«. Werden Unterschiede festgestellt, listet DEBUG die Adressen mit unteschiedlichem Inhalt im Format
Segment1:Offset1 Byte1 Byte2 Segment2:Offset2
auf. Ansonsten erfolgt keine Ausgabe.
Dump
Syntax: D [Anfang[ Ende]]
Bedeutung: Gibt den Inhalt des Speicherbereichs ab der Adresse »Anfang« bis zur Adresse »Ende« aus. Die Ausgabe gliedert sich in drei Abschnitte. Jede Zeile beginnt mit dem Anfang der Segment- und Offset-Adresse von 16 aufeinanderfolgenden Bytes, die in der Mitte des Bildschirms hexadezimal und ganz rechts als ASCII-Zeichen dargestellt werden. Jedes, ohne Parameter eingebene D bringt einen Speicherauszug der nächsten 128 Byte ab der zuletzt angezeigten Adresse auf den Bildschirm.
Enter
Syntax: E [Adresse[ Liste]]
Bedeutung: Dient zur Eingabe von zweistelligen hexadezimalen Werten ab der angegebenen »Adresse« im Speicher. Geben Sie keine »Liste« an, geschieht die Eingabe interaktiv, wobei zur aktuellen Adresse der momentane Inhalt mit angezeigt wird.
Fill
Syntax: F Anfang,Ende Liste
Bedeutung: Füllt den Speicherbereich ab der Adresse »Anfang« bis zur Adresse »Ende« mit den Werten in der »Liste«. Enthält der Bereich zwischen »Anfang« und »Ende« mehr Byte als Werte in der »Liste«, dann wird die »Liste« so oft wiederholt, bis der Bereich vollständig belegt ist.
Go
Syntax: G [=Anfang[ Break1 Break2 … Break10]]
Bedeutung: Führt das ab der Adresse »Anfang« beginnende Maschinenprogramm aus. Das Gleichheitszeichen ist notwendig, um die Adresse »Anfang« von sogenannten Anhaltepunkten (Breakpoints) zu unterscheiden. Sie können nämlich bis zu 10 Adressen angeben, an denen das Programm stoppen soll. Der Anhaltepunkt muß natürlich einen ausführbaren Assemblerbefehl im korrekt aufgelisteten Programm enthalten. Trifft DEBUG auf einen Anhaltepunkt, stoppt die Ausführung solange, bis Sie erneut G eingeben. Danach wird das Programm mit dem nächst ausführbaren Befehl nach dem Breakpoint fortgeführt.
Hex
Syntax: H Wert1,Wert2
Bedeutung: Bildet aus den beiden hexadezimalen Werten »Wert1« und »Wert2« zuerst die Summe und anschließend die Differenz und gibt die Ergebnisse in dieser Reihenfolge ebenfalls hexadezimal auf dem Bildschirm aus.
Input
Syntax: I Port
Bedeutung: Liest ein Byte aus der mit »Port« bezeichneten Adresse eines 16-Bit-Anschlusses ein und gibt den Wert auf dem Bildschirm aus.
Load
Syntax: L [Anfang[ Lw# Sektor Anzahl]]
Bedeutung: Lädt eine »Anzahl« von Sektoren, beginnend beim absoluten »Sektor«, des mit »Lw#« numerierten Laufwerks (0 = A, 1 = B, 2 = C etc.) an die Adresse »Anfang« im Arbeitsspeicher. Verwenden Sie keinen Parameter, lädt DEBUG die mit dem N-Befehl bezeichnete Datei in den Speicher. Die Register DX:CX erhalten dabei den Wert, der die Länge des Programms angibt.
Move
Syntax: M Adresse1,Adresse2 Adresse3
Bedeutung: Kopiert den Bereich von »Adresse1« bis »Adresse2« an die »Adresse3«.
Name
Syntax: N [Lw:][\Pfad\]Name
Bedeutung: Gibt einer mit dem L-Befehl zu ladenden oder mit dem W-Befehl zu speichernden Datei einen Namen, der für »Lw:« den korrekten Laufwerksbuchstaben und anstelle von »\Pfad\« das gewünschte Directory enthalten darf.
Out
Syntax: O Port Byte
Bedeutung: Gibt den Wert von »Byte« an die mit »Port« bezeichnete Adresse eines 16-Bit-Anschlusses aus.
Proceed
Syntax: P [=Adresse][Anzahl]
Bedeutung: Dieser Befehl ist in kaum einem DOS-Handbuch dokumentiert. Deshalb kann es passieren, daß Ihre DEBUG-Version ihn nicht kennt. Er startet ähnlich wie Trace eine »Anzahl« von Anweisungen ab der mit »=Adresse« angegebenen Speicherstelle, führt jedoch komplette Unterprogramme, die durch »INT« oder »CALL« aufgerufen werden in einem Schritt aus. Ein Trace-Befehl kann nämlich leicht zur endlosen Tortour ausarten, weil die gesamte Unterroutine jedesmal Schritt für Schritt durchlaufen wird.
Quit
Syntax: Q
Bedeutung: Dient zum Verlassen von DEBUG.
Register
Syntax: R [Register]
Bedeutung: Dient zum Anzeigen und Ändern eines CPU-Registers. Folgende Registernamen sind zulässig: AX, BX, CX, DX, SP, BP, SI, DI, DS, ES, SS, CS, IP, PC und F. Verwenden Sie keinen Parameter, werden sämtliche Register mit ihren aktuellen Werten angezeigt.
Search
Syntax: S Anfang,Ende Liste
Bedeutung: Durchsucht den Speicherbereich ab der Adresse »Anfang« bis zur Adresse »Ende« nach den Werten in der »Liste«. Ist die Suche erfolgreich, erhalten Sie als Ergebnis alle Speicheradressen, die das erste Byte der gesuchten Liste enthalten.
Trace
Syntax: T [=Adresse][Anzahl]
Bedeutung: Startet eine »Anzahl« von Anweisungen ab der mit »=Adresse« angegebenen Speicherstelle und gibt nach jedem Schritt sämtliche Register wie beim R-Befehl aus. Geben Sie keine »Anzahl« an, führt Trace genau einen einzigen Befehl aus. Lassen Sie die Adresse weg, startet der Befehl mit dem Byte, auf das der Instruction-Pointer (IP) gerade zeigt. Geben Sie wiederholt »T« ein, können Sie ein Programm schrittweise ablaufen lassen.
Unassemble
Syntax: U [Anfang[,Ende]]
Bedeutung: Disassembliert den Bereich von Adresse »Anfang« bis »Ende« und gibt die Mnemonics mit ihren Operanden auf dem Bildschirm aus. Geben Sie keinen Parameter an, beginnt DEBUG mit der Adresse, die dem Wert des Instruction-Pointers (IP) entspricht und disassembliert bei jeder neuen Eingabe von U die nächsten 32 Byte nach der zuletzt disassemblierten Adresse.
Write
Syntax: W [Anfang[ Lw# Sektor Anzahl]]
Bedeutung: Schreibt eine »Anzahl« von Sektoren, beginnend beim absoluten »Sektor«, von der Speicheradresse »Anfang« auf das mit »Lw#« numerierte Laufwerk (0 = A, 1 = B, 2 = C etc.). Verwenden Sie keinen Parameter, schreibt DEBUG den Speicherbereich ab der Offset-Adresse 100h im aktuellen Segment in die mit dem N-Befehl bezeichnete Datei. Die Anzahl der zu schreibenden Bytes wird dann durch den Wert der Register DX:CX bestimmt. Achtung! Äußerste Vorsicht ist geboten!
Quelle: 200 Utilities für PC-/MS-DOS von Gerhard Schild und Thomas Jannot