Statt DEBUG: Demonstration von RDUMP und MDUMP |
Zurück zur Assemblerauswahlseite |
Zurück zu DEBUG |
| 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 DokumentationLeider 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 |