DEBUG auf einen Blick

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