Fehlermeldung nach ausführen von Dos Anwendung (Win98)
-
Hallo,
Nein das ist kein Scherz, ich habe eine VM mit Win98.
Zur Zeit arbeite ich mit BIOS Interrupts (Videomodus, Disketten usw..)
Nun erhalte ich nach dem Beenden mit
xor eax, eax
mov ah,4Ch
int 21hdie Meldung, das noch MS-Dos basierte Programme ausgführt werden.
Beenden Sie diese zuerst...blabla...Ich reservierer keinen Speicher noch sonst irgendwas.. Lediglich einen String gebe ich aus, bevor das Programm beendet werden soll.
Erstellt wird eine .EXE im Modell SMALL mit Befehlssatz des 386.
Der PC stürzt zwar nicht ab, aber ich möchte schon gern die Meldung vermeiden.
Woran liegt das?Nicky
-
supernicky schrieb:
xor eax, eax
mov ah,4Ch
int 21hUngewöhnliches DOS Programm!
supernicky schrieb:
Zur Zeit arbeite ich mit BIOS Interrupts (Videomodus, Disketten usw..)
Int 21h ist ein DOS Interrupt.
supernicky schrieb:
Woran liegt das?
Du brauchst einen Hellseher!?
Alternativ kannst du dein Programm ja mal in DOSBox (->google) laufen lassen - damit ersparst du dir dann auch Win98 (kein Scherz).
-
mov ah,4Ch
int 21hist zum beenden der Anwendung.
ja klar ist der int 21h ein Dos Interrupt.. nur mit den BIOS Interrupts
kann ich kein Programm beenden.
Ich hab ja gechrieben das ich eine .EXE erstellt habe. (Model SMALL und
386er Modus)hier mal der ganze Code:
.model small .386 daten segment disk db "3,5 Zoll mit 1,44 MB",10,13,"$" daten ends stapel segment dw 128 dup(?) stapel ends code segment assume ds:daten,cs:code,ss:stapel,es:nothing start: mov ax, daten mov ds, ax xor edx, edx xor eax, eax mov ah, 08h int 13h cmp bl, 04h jne ende xor eax, eax xor edx, edx mov dx, offset disk mov ah, 09h int 21h ende: xor eax, eax mov ah, 4Ch int 21h code ends end start
Nicky
Edit: Bitte code tags benutzen.
-
Sowas
xor eax, eax mov ah, 4Ch
oder der Klassiker
mov al, 0 mov ah, 4Ch
tut schon ein bisschen weh. Bitte nicht.
Generell solltest du es vermeiden, in 16Bit-Programmen 32Bit-Register zu verwenden und umgekehrt.
Tritt das Problem nicht auf, wenn du dein Programm nicht startest? Oder wenn du den int 13h-Aufruf entfernst? Oder mit anderen DOS-Programmen?
Sehe da auf den ersten Blick kein weiteres Problem.
Viel Probieren - auch mit einem Debugger ist generell eine gute Idee. Falls du nicht gerade die Eigenheiten von Win98 untersuchen willst oder noch was Anderes mit win98 zu tun hast, wurde ja schon gesagt: DOSBox.
-
Hallo,
Die Meldung kommt auch ohne mein Zutun.
Sobald ich von Dos nach Windows wechseln will.. also kein Fehler im Programm.
Ich hatte ja lange kein Dos mehrich weiß das
xor ax, ax mov ah, 09h int 21h
nicht toll ist.. in den Büchern steht auch immer
mov ax, 0900h int 21h
drin. Ich schreib ja nur für mich, da ist das glaub ich Wurscht
Nächste Woche kommen meine Disketten.. dann gehts mit Interrupt 13h weiter
Ich bleibe aber erstmal bei Win98.
Danke und Gruß
Nicky
-
Also, wenn ich mit fasm einen Code wie diesen:
org 100h xor eax,eax mov ah,09 mov dx,message int 21h mov ah,4ch int 21h message db "Hallo Test",24h
übersetze, gibt es keine Fehlermeldungen.
Man kann auf diese Weise auch "Protected Mode" Programme schreiben. Das Problem ist aber, wie Windows die Dos-Schnittstelle behandelt bzw. wie VMs das machen. Dazu kommt, dass unterschiedliche Windowsversionen unterschiedlich kompatibel sind. Spieleprogrammiere hatten früher, um mit 32Bit Registern zu arbeiten, Dos-Extender eingesetzt. Heute gibt es nur noch Directx.
Für den Prozessor gibt es das Problem, dass er wissen muss, ob er 16 Bit oder 32 Bit oder 64 Bit standardmäßig ausführt. Weil viele Befehle identisch sind, bekommen sie einen relativen Päfix.Schauen wir uns mal an, was das Windows Programm Debug aus unserem Code herausliest:
C:\Users\nachtfeuer\FASMW>debug eaxtest.com -d 1A9D:0100 66 31 C0 B4 09 BA 0E 01-CD 21 B4 4C CD 21 48 61 f1.......!.L.!Ha 1A9D:0110 6C 6C 6F 20 54 65 73 74-24 00 00 00 00 00 00 00 llo Test$....... 1A9D:0120 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 1A9D:0130 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 1A9D:0140 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 1A9D:0150 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 1A9D:0160 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 1A9D:0170 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ -u 1A9D:0100 66 DB 66 1A9D:0101 31C0 XOR AX,AX 1A9D:0103 B409 MOV AH,09 1A9D:0105 BA0E01 MOV DX,010E 1A9D:0108 CD21 INT 21 1A9D:010A B44C MOV AH,4C 1A9D:010C CD21 INT 21 1A9D:010E 48 DEC AX 1A9D:010F 61 DB 61 1A9D:0110 6C DB 6C 1A9D:0111 6C DB 6C 1A9D:0112 6F DB 6F 1A9D:0113 205465 AND [SI+65],DL 1A9D:0116 7374 JNB 018C 1A9D:0118 2400 AND AL,00 1A9D:011A 0000 ADD [BX+SI],AL 1A9D:011C 0000 ADD [BX+SI],AL 1A9D:011E 0000 ADD [BX+SI],AL -
Aha! Debug - und damit auch Windows versteht wohl nur 16 Bit - Dos. Der Hexcode verrät hier viel mehr, als der dumme Disassembler. Der Hexwert 66 ist der Präfix für 16Bit Ausgangsposition. 16bit, ein Hinweis darauf, das Windows Dos-Programme über den Virtual Mode ausführt.
Nächster Versuch: Wir schauen uns das ganze in einem 32bit Debug Klone an, hier eines von Paul Vojta ( http://math.berkeley.edu/~vojta/ )
(um 32bit Register zu benutzten, gibt man rx ein:)
-rx 386 regs on -r EAX=00000000 EBX=00000000 ECX=00000019 EDX=00000000 ESP=0000FFFE EBP=00000000 ESI=00000000 EDI=00000000 NV UP EI NG NZ NA PO NC DS=1BC2 ES=1BC2 SS=1BC2 CS=1BC2 FS=0000 GS=0000 EIP=00000100 1BC2:0100 6631C0 XOR EAX,EAX -d 1BC2:0100 66 31 C0 B4 09 BA 0E 01-CD 21 B4 4C CD 21 48 61 f1.......!.L.!Ha 1BC2:0110 6C 6C 6F 20 54 65 73 74-24 00 00 00 00 00 00 00 llo Test$....... 1BC2:0120 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 1BC2:0130 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 1BC2:0140 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 1BC2:0150 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 1BC2:0160 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 1BC2:0170 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ -u 1BC2:0100 6631C0 XOR EAX,EAX 1BC2:0103 B409 MOV AH,09 1BC2:0105 BA0E01 MOV DX,010E 1BC2:0108 CD21 INT 21 1BC2:010A B44C MOV AH,4C 1BC2:010C CD21 INT 21 1BC2:010E 48 DEC AX 1BC2:010F 61 POPA 1BC2:0110 6C INSB 1BC2:0111 6C INSB 1BC2:0112 6F OUTSW 1BC2:0113 205465 AND [SI+65],DL 1BC2:0116 7374 JAE 018C 1BC2:0118 2400 AND AL,00 1BC2:011A 0000 ADD [BX+SI],AL 1BC2:011C 0000 ADD [BX+SI],AL 1BC2:011E 0000 ADD [BX+SI],AL -g DPMI entry hooked, new entry=1449:2C2F Hallo Test Program terminated normally (0024) -
http://de.wikipedia.org/wiki/DOS_Protected_Mode_Interface
http://wiki.osdev.org/Unreal_ModeUnd der Vollständigkeit halber gucken wir uns auch nochmal an, was IDA macht:
seg000:0100 ; seg000:0100 ; +-------------------------------------------------------------------------+ seg000:0100 ; ¦ This file is generated by The Interactive Disassembler (IDA) ¦ seg000:0100 ; ¦ Copyright (c) 2010 by Hex-Rays SA, <support@hex-rays.com> ¦ seg000:0100 ; ¦ Licensed to: Freeware version ¦ seg000:0100 ; +-------------------------------------------------------------------------+ seg000:0100 ; seg000:0100 ; seg000:0100 seg000:0100 ; File Name : C:\Users\nachtfeuer\FASMW\eaxtest.COM seg000:0100 ; Format : MS-DOS COM-file seg000:0100 ; Base Address: 0h Range: 100h-119h Loaded length: 19h seg000:0100 seg000:0100 .386 seg000:0100 .model tiny seg000:0100 seg000:0100 ; --------------------------------------------------------------------------- seg000:0100 seg000:0100 ; Segment type: Pure code seg000:0100 seg000 segment byte public 'CODE' use16 seg000:0100 assume cs:seg000 seg000:0100 org 100h seg000:0100 assume es:nothing, ss:nothing, ds:seg000, fs:nothing, gs:nothing seg000:0100 seg000:0100 ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ seg000:0100 seg000:0100 seg000:0100 public start seg000:0100 start proc near seg000:0100 xor eax, eax seg000:0103 mov ah, 9 seg000:0105 mov dx, 10Eh seg000:0108 int 21h ; DOS - PRINT STRING seg000:0108 ; DS:DX -> string terminated by "$" seg000:010A mov ah, 4Ch seg000:010C int 21h ; DOS - 2+ - QUIT WITH EXIT CODE (EXIT) seg000:010C start endp ; AL = exit code seg000:010C seg000:010C ; --------------------------------------------------------------------------- seg000:010E db 48h ; H seg000:010F db 61h ; a seg000:0110 db 6Ch ; l seg000:0111 db 6Ch ; l seg000:0112 db 6Fh ; o seg000:0113 db 20h seg000:0114 db 54h ; T seg000:0115 db 65h ; e seg000:0116 db 73h ; s seg000:0117 db 74h ; t seg000:0118 db 24h ; $ seg000:0118 seg000 ends seg000:0118 seg000:0118 seg000:0118 end start
-
Das scheint mir alles etwas zu verwirrend, um es so unkommentiert stehen zu lassen.
Also der Reihe nach...
nachtfeuer schrieb:
Man kann auf diese Weise auch "Protected Mode" Programme schreiben.
Auf welche Weise? Zusammenhang?
nachtfeuer schrieb:
Das Problem ist aber, wie Windows die Dos-Schnittstelle behandelt bzw. wie VMs das machen. Dazu kommt, dass unterschiedliche Windowsversionen unterschiedlich kompatibel sind.
Welches Problem? Welche "Dos-Schnittstelle"?
nachtfeuer schrieb:
Spieleprogrammiere hatten früher, um mit 32Bit Registern zu arbeiten, Dos-Extender eingesetzt. Heute gibt es nur noch Directx.
Unsinn.
nachtfeuer schrieb:
Für den Prozessor gibt es das Problem, dass er wissen muss, ob er 16 Bit oder 32 Bit oder 64 Bit standardmäßig ausführt. Weil viele Befehle identisch sind, bekommen sie einen relativen Päfix.
Grbl? Koenntest das Richtige meinen, liest sich aber wie Quatsch.
nachtfeuer schrieb:
Schauen wir uns mal an, was das Windows Programm Debug aus unserem Code herausliest:
C:\Users\nachtfeuer\FASMW>debug eaxtest.com -d 1A9D:0100 66 31 C0 B4 09 BA 0E 01-CD 21 B4 4C CD 21 48 61 f1.......!.L.!Ha 1A9D:0110 6C 6C 6F 20 54 65 73 74-24 00 00 00 00 00 00 00 llo Test$....... 1A9D:0120 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 1A9D:0130 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 1A9D:0140 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 1A9D:0150 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 1A9D:0160 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 1A9D:0170 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ -u 1A9D:0100 66 DB 66 1A9D:0101 31C0 XOR AX,AX 1A9D:0103 B409 MOV AH,09 1A9D:0105 BA0E01 MOV DX,010E 1A9D:0108 CD21 INT 21 1A9D:010A B44C MOV AH,4C 1A9D:010C CD21 INT 21 1A9D:010E 48 DEC AX 1A9D:010F 61 DB 61 1A9D:0110 6C DB 6C 1A9D:0111 6C DB 6C 1A9D:0112 6F DB 6F 1A9D:0113 205465 AND [SI+65],DL 1A9D:0116 7374 JNB 018C 1A9D:0118 2400 AND AL,00 1A9D:011A 0000 ADD [BX+SI],AL 1A9D:011C 0000 ADD [BX+SI],AL 1A9D:011E 0000 ADD [BX+SI],AL -
Aha! Debug - und damit auch Windows versteht wohl nur 16 Bit - Dos. Der Hexcode verrät hier viel mehr, als der dumme Disassembler. Der Hexwert 66 ist der Präfix für 16Bit Ausgangsposition. 16bit, ein Hinweis darauf, das Windows Dos-Programme über den Virtual Mode ausführt.
Unsinn.
MS Debug ist eine Mumie, ein Relikt aus DOS 1.0- und 8086-Zeiten. Entsprechend begrenzt ist es auch, was den Befehlssatz angeht. So fehlt in diesem Programm u.A. schlicht eine Unterstuetzung fuer 32Bit-Register. Etwas Anderes laesst sich davon nicht ableiten.
Uebrigens bewirkt der Instruktionspraefix 66h in 16-bit-Programmmen nichts anderes, als dass der nachfolgende Befehl 32Bit- statt 16Bit-Register verwendet.
So ist folgendes in einem 16Bit-Modus aequivalentdb 66h xor ax, ax ; ist das Gleiche wie xor eax, eax ; beides wird zur Bytefolge 66 33 c0 codiert.
nachtfeuer schrieb:
Nächster Versuch: Wir schauen uns das ganze in einem 32bit Debug Klone an, hier eines von Paul Vojta ( http://math.berkeley.edu/~vojta/ )
(um 32bit Register zu benutzten, gibt man rx ein:)
-rx 386 regs on -r EAX=00000000 EBX=00000000 ECX=00000019 EDX=00000000 ESP=0000FFFE EBP=00000000 ESI=00000000 EDI=00000000 NV UP EI NG NZ NA PO NC DS=1BC2 ES=1BC2 SS=1BC2 CS=1BC2 FS=0000 GS=0000 EIP=00000100 1BC2:0100 6631C0 XOR EAX,EAX -d 1BC2:0100 66 31 C0 B4 09 BA 0E 01-CD 21 B4 4C CD 21 48 61 f1.......!.L.!Ha 1BC2:0110 6C 6C 6F 20 54 65 73 74-24 00 00 00 00 00 00 00 llo Test$....... 1BC2:0120 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 1BC2:0130 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 1BC2:0140 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 1BC2:0150 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 1BC2:0160 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 1BC2:0170 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ -u 1BC2:0100 6631C0 XOR EAX,EAX 1BC2:0103 B409 MOV AH,09 1BC2:0105 BA0E01 MOV DX,010E 1BC2:0108 CD21 INT 21 1BC2:010A B44C MOV AH,4C 1BC2:010C CD21 INT 21 1BC2:010E 48 DEC AX 1BC2:010F 61 POPA 1BC2:0110 6C INSB 1BC2:0111 6C INSB 1BC2:0112 6F OUTSW 1BC2:0113 205465 AND [SI+65],DL 1BC2:0116 7374 JAE 018C 1BC2:0118 2400 AND AL,00 1BC2:011A 0000 ADD [BX+SI],AL 1BC2:011C 0000 ADD [BX+SI],AL 1BC2:011E 0000 ADD [BX+SI],AL -g DPMI entry hooked, new entry=1449:2C2F Hallo Test Program terminated normally (0024) -
http://de.wikipedia.org/wiki/DOS_Protected_Mode_Interface
http://wiki.osdev.org/Unreal_ModeDas soll jetzt genau was zeigen?