N
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 aequivalent
db 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_Mode
Das soll jetzt genau was zeigen?