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>
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
.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