Home

Der Debugger DEBUG

Zurück zur Assemblerauswahlseite

8086 Assembler (MS-DOS):
Statt DEBUG: Demonstration von RDUMP und MDUMP

Auf dieser Seite wird die Wirkung zweier Testhilfen für Assemblerprogramme gezeigt. MDUMP erzeugt einen Speicherdump auf dem Bildschirm, RDUMP zeigt die Registerstände an. Nachfolgend ist ein Versuchslauf des Programmes TEST dargestellt:
0:13:30:42 F:\dos\MASM>test /mit falschem Parameter

DI=  SI=  BP=  SP=  BX=  DX=  CX=  AX=  CS=  DS=  ES=  SS=
0000 0000 0000 FFF6 0000 0000 0000 0720 0E8E 0E8E 0E8E 0E8E

005C: 00 20 20 20
0060: 20 20 20 20 20 20 20 20 00 00 00 00 00 46 41 4C
0070: 53 43 48 45 4D 20 20 20 00 00 00 00 00 00 00 00
0080: 18 20 2F 6D 69 74 20 66 61 6C 73 63 68 65 6D 20
0090: 50 61 72 61 6D 65 74 65 72 0D 00 01 01 01 01 01
00A0: 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
00B0: 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
00C0: 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01
00D0: 01 01 01 01 01 01 01 01 01 01 01 01

DI=  SI=  BP=  SP=  BX=  DX=  CX=  AX=  CS=  DS=  ES=  SS=
0373 0000 0000 FFE4 00DC 3129 0013 0E20 0E8E 0E8E 0E8E 0E8E
BATch Control Program Vers.:13.09.97

batc ?     Eingabe J/N im Dialog
Errorlevel bei Ausgang: 0 nach J od.Y, 1 nach N, 3 nach ^C
batc W     prompted mit <+
batc B     Warmboot
batc Cx    setzt Randfarben (EGA/VGA) x=0...F, vergl. batc F
batc D     Für PPC: Errorlevel auf 1 falls Datum vor 1987, sonst auf 0
           und Blockcursor ein
batc E...  Ausgabe ESC... zum Bildschirm (z.B. für ANSI-Treiber)
batc F     Anzeige Farbpalette auf Bildschirm.
batc J     setzt Errorlevel auf 0
batc K     Keycode anzeigen
batc M     Verwendung als more-Filter, Aufruf hinter |
batc N     setzt Errorlevel auf 1
batc P...  Textausgabe auf Drucker. Anleitung: batc P
batc R     Resetbefehl an Printer auf Port 0
batc S     Zeichenvorrat zum Bildschirm
batc V     Zeigt den Inhalt des Video-State-Buffers
batc xx    VGA auf xx Zeilen/Seite, 25 / 28 / 43
batc Y     Anzeige diverser Systeminformationen

0:13:30:57 F:\dos\MASM>
Man kann bei dem Speicherdump ab Adresse 80h erkennen, wie der Aufrufparameter (dies ist der Text " /mit falschem Parameter") durch das Betriebssystem ab der Adresse 80H eingetragen wurde:
18h gibt die Parameterlänge mit 24 Zeichen ab dem Zwischenraum vor dem Bruchstrich an. Unmittelbar ab Adresse 81 folgt die ASCII-Darstellung des Textes mit einem vorgestellten Zwischenraumzeichen und einem abschließenden Carriage Return (0D) zur Kennzeichnung des Endes der Zeichenkette.

Dies Programm fragt übrigens den Inhalt der Adresse 57h ab: Das Betriebssystem versucht dort aus den eingegebenen Aufrufparametern einen FCB aufzubauen. In diesem Fall gelingt ihm das überhaupt nicht, da die verwendeten falschen Aufrufparameter mit einem Bruchstrich beginnen und ein Bruchstrich ist innerhalb eines Dateinamens verboten. Hätte man einen der erlaubten Parameter, z.B. den Buchstaben "w" eingegeben, so stünde auf Adresse 57h ein in Großschrift gewandeltes "W". Ab Adresse 6Dh beginnt der zweite FCB. Hier hat das Betriebssystem mit dem zweiten Aufrufparameterwort "falschem" mehr Erfolg gehabt, und das Wort "FALSCHEM" eintragen können.

Nachfolgend der Anfang des Quellprogramms. Dies ist der Teil, der die obenstehende Bildschirmausgabe erzeugt.

        page        65,120
comment #
batch control programm
sammelsurium kleiner routinen
matthaei, 31-dec-88, 26.6.94
#
FALSE       EQU        0
TRUE        EQU        NOT FALSE

DUMP$       equ        true        ;für mdump,  rdump
PROMPT$     equ        true        ;für ENTER, INKJN
INTASC$     equ        true        ;für INT2ASC, ASC2INT
STRING$     equ        false       ;für CMPSTR, LENSTR, INSTR, MOVSTR

;konstanten für PCSTAT

commax      equ        4        ;max. 4 ser. schnittstellen
;adressen
biosvar     equ        0040h        ;bios variablensegment
comptr      equ        0000h        ;adressen der com-ports
equlist     equ        0010h        ;equipment list

        .xlist
        include firm.asm         ;firm.asm enthaelt auch den Anfang des Codeteils
        include time.mac
        .list
        .sall
        ;Testhilfe 1. Registeranzeige und 128 Bytes ab dem fcb
        rdump
        mdump fcb,80H
        cld
        mov        b attr,Ma_normal
        mov        al,byte ptr cs:fcb+1
        lea        di,btab   ;befehlstabelle
        mov        cx,lbtab  ;deren länge
;Testhilfe 2. Registeranzeige nach Laden der Register. Vorher werden die allgemeinen
;Register und die Flags gesichert
        pushf
        pusha
        rdump
        popa
        popf
        repne     scasb
        je        w1
        jmp       hilfe               ;ungültiger aufrufparameter


btab    db        'MYWV42BCDEFPRS?NJK ';mgl.Parameter
lbtab   equ       $-btab
wohin   dw        hilfe               ;hilfeanzeige
        dw        keycode             ;tastencode zeigen
        dw        ret0                ;errorlevel auf 0
        dw        ret1                ;errorlevel auf 1
        dw        inkjn               ;eingabe j/n
        dw        chrshow             ;zeichensatz
        dw        resetp              ;reset printer
        dw        list_p              ;druckausgabe
        dw        farbe               ;farbpalette zum bildschirm
        dw        scrn_esc            ;bildchirmausgabe esc-string
        dw        datetest            ;datumtest und Blockcursor ein
        dw        crand               ;setzt farbigen rand (ega)
        dw        boot                ;warmboot
        dw        ega25               ;vga auf 25 / 28 Zeilen / Seite
        dw        ega43               ;vga auf 43 Zeilen/Seite
        dw        vgainfo             ;anzeige video state buffer
        dw        weiter              ;Abwarten Eingabe der CR-Taste
        dw        pcstat              ;PC-Status anzeigen
        dw        more                ;Verwendung als More-Filter
w1:     add        cx,cx              ;*2->tabellenoffset
        mov        di,cx
        jmp        wohin[di]

;hilfstextanzeige wenn aufruf ohne parameter

hilfe:
;scrollup 26,0,0,25,80,n_blck
;locate 0,0
        call        prmsg
 dbl   'BATch Control Program Vers.:13.09.97'
 dbl
 dbl   'batc ?     Eingabe J/N im Dialog'
 dbl   'Errorlevel bei Ausgang: 0 nach J od.Y, 1 nach N, 3 nach ^C'
 dbl   'batc W     prompted mit <+'
 dbl   'batc B     Warmboot'
 dbl   'batc Cx    setzt Randfarben (EGA/VGA) x=0...F, vergl. batc F'
 dbl   'batc D     Für PPC: Errorlevel auf 1 falls Datum vor 1987, sonst auf 0'
 dbl   '           und Blockcursor ein'
 dbl   'batc E...  Ausgabe ESC... zum Bildschirm (z.B. für ANSI-Treiber)'
 dbl   'batc F     Anzeige Farbpalette auf Bildschirm.'
 dbl   'batc J     setzt Errorlevel auf 0'
 dbl   'batc K     Keycode anzeigen'
 dbl   'batc M     Verwendung als more-Filter, Aufruf hinter |'
 dbl   'batc N     setzt Errorlevel auf 1'
 dbl   'batc P...  Textausgabe auf Drucker. Anleitung: batc P'
 dbl   'batc R     Resetbefehl an Printer auf Port 0'
 dbl   'batc S     Zeichenvorrat zum Bildschirm',lf
 dbl   'batc V     Zeigt den Inhalt des Video-State-Buffers'
 db    'batc ',escp
v1     db          ma_hell          ;hell
       db          'xx',escp
v2     db          Ma_normal        ;normal
       dbl         '    VGA auf xx Zeilen/Seite, 25 / 28 / 43'
       dbl         'batc Y     Anzeige diverser Systeminformationen'
       db          0
       jmp         ret1

RDUMP als Hilfe bei unklarer Dokumentation

Leider komme ich nicht immer mit Funktionsbeschreibungen zurecht. Dies Beispiel zeigt, wie ich RDUMP eingesetzt habe, um meine Unklarheiten bei der DOS-Versionsabfrage zu reduzieren. Ich habe dazu ein kleines Testprogramm geschrieben.
.MODEL TINY
;======================================
; Versionsabfrage in DOS
;======================================
;
FALSE   EQU     0
TRUE    EQU     NOT FALSE

dump$   equ     true    ;fuer mdump,  rdump
prompt$ equ     false   ;fuer PROMPT, INKJN
intasc$ equ     false   ;fuer INT2ASC, ASC2INT
string$ equ     false   ;fuer CMPSTR, LENSTR, INSTR, MOVSTR

.CODE
        ORG     100h

Vers:   JMP     around
        include firm.mac

; Texte
Text     DB     'DOS Version '
version  db     'x','.'
revision db     'yy',0Dh,0Ah,'$'
;
around:
        prstr   <"Abfrage mit Funktion 30h und 00 in AL",cr>
        MOV     AX,3000h        ;Versionsabfrage
        INT     21h             ;ah=Revision, al=version
        pusha
        rdump
        popa

        or      AL,30h          ;Hauptversion in ASCII konvertieren
        MOV     cs:version, al  ;ausgeben

        mov     al,ah           ;Codewandlung binaer in 2 bytes ASCII
        aam
        or      ax,3030h
        mov     cs:revision,ah
        mov     cs:revision+1,al

        MOV     DX,OFFSET Text  ;Textausgabe
        mov     ah,9
        INT     21h

        prstr   <cr,"Abfrage mit Funktion 30h und 01 in AL",cr>
        MOV     AX,3001h        ;Versionsabfrage
        INT     21h             ;ah=Revision, al=version
        pusha
        rdump
        popa

        prstr   <cr,"Abfrage mit Funktion 33h und 06 in AL",cr>
        MOV     AX,3306h        ;Versionsabfrage
        INT     21h             ;ah=Revision, al=version
        pusha
        rdump
        popa

        mov     al,bl
        or      AL,30h          ;Hauptversion in ASCII konvertieren
        MOV     cs:version, al  ;ausgeben

        mov     al,bh           ;Codewandlung binaer in 2 bytes ASCII
        aam
        or      ax,3030h
        mov     cs:revision,ah
        mov     cs:revision+1,al

        MOV     DX,OFFSET Text  ;Textausgabe
        mov     ah,9
        INT     21h


        MOV     AX,4C00h        ;EXIT
        INT     21h
        END     Vers

Die Anzeige auf dem Bildschirm ergab:

Abfrage mit Funktion 30h und 00 in AL
di=  si=  bp=  sp=  dx=  cx=  bx=  ax=  cs=  ds=  es=  ss=
FFFE 0100 091E FFDE 3125 0000 FF00 0005 12E4 12E4 12E4 12E4
DOS Version 5.00

Abfrage mit Funktion 30h und 01 in AL
di=  si=  bp=  sp=  dx=  cx=  bx=  ax=  cs=  ds=  es=  ss=
FFFE 0100 091E FFDE 3125 0000 0000 0005 12E4 12E4 12E4 12E4

Abfrage mit Funktion 33h und 06 in AL
di=  si=  bp=  sp=  dx=  cx=  bx=  ax=  cs=  ds=  es=  ss=
FFFE 0100 091E FFDE 1000 0000 3205 3306 12E4 12E4 12E4 12E4
DOS Version 5.50

Letztes Upload: 30.03.2017 um 08:42:46