Hallo
Ich bins nochmal. Wenn ich diesen Code mit Bochs, oder Diskette probiere, dann blinkt Bochs oder der Computer Schaltet sich aus. ;16 Bit Code erstellen
jmp start ;GDT überspringen
NULL_Desc:
dd 0
dd 0
CODE_Desc:
dw 0xFFFF ;Segmentgröße Byte 0/1
dw 0 ;Segmentbasisadresse Byte 0/1
db 0 ;Segmentbasisadresse Byte 2
db 10011010b ;Zugriffsberechtigungen
db 11001111b ;Zusatz + Segmentgröße Bits 16 - 19
db 0 ;Segmentbasisadresse Byte 3
DATA_Desc:
dw 0xFFFF
dw 0
db 0
db 0x92
db 0xCF
db 0
gdt:
Limit dw 0 ;Größe der GDT (wird später eingetragen)
Base dd 0 ;Adresse der GDT (wird später eingetragen)
idt:
Limite dw 0 ;Größe der GDT (wird später eingetragen)
Basiis dd 0 ;Adresse der GDT (wird später eingetragen)
IDTAnfang:
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
dw Handler, 8, 8E00h, 0
IDTSchluss:
start:
cli
;Interrupts ausschalten
mov eax, cs ;EAX auf derzeitiges Codesegment setzen
mov ds, ax ;DS auf Codesegment setzen
shl eax, 4 ;EAX mit 16 multiplizieren (Lineare Adresse
;des Codesegments errechnen)
mov [CODE_Desc+2], ax ;Lineare Adresse des Codesegmentes als
mov [DATA_Desc+2], ax ;Startadresse des Code- und Datendeskriptors
shr eax, 16 ;eintragen
mov [CODE_Desc+4], al
mov [DATA_Desc+4], al
mov eax, cs ;Startadresse der GDT errechnen
shl eax, 4
add eax, NULL_Desc
mov [Base], eax ;Startadresse der GDT eintragen
mov [Limit], WORD gdt - NULL_Desc -1 ;Größe der GDT errechnen und eintragen
lgdt [gdt]
mov eax, cs
shl eax, 4
add eax, [IDTAnfang]
mov [Basiis], eax
mov eax,[IDTSchluss]
sub eax,[IDTAnfang]
mov [Limite],eax ;Größe der IDT errechnen und eintragen
lidt [idt] ;GDT laden
mov eax, cr0 ;In den Protected Mode schalten,
or eax, 1 ;indem Bit 0 des CR0 Registers auf 1
mov cr0, eax ;gesetzt wird
db 0xea ;FAR-JUMP zum Codesegment
dw PMODE
dw 0x8
[BITS 32] ;32 Bit Code erstellen
PMODE:
mov WORD [CODE_Desc+2], 0 ;Code Segmentstartaddresse auf 0 setzen
mov WORD [DATA_Desc+2], 0 ;Daten Segmentstartadresse auf 0 setzen
mov BYTE [CODE_Desc+4], 0 ;Code Segmentstartaddresse auf 0 setzen
mov BYTE [DATA_Desc+4], 0 ;Daten Segmentstartadresse auf 0 setzen
mov eax, 2 ;Selektor für das Datensegment erstellen
shl eax, 3
mov ds, ax ;Daten- Stack- und Extrasegment mit
mov ss, ax ;Datensegmentdeskriptor laden
mov es, ax
mov eax, 0 ;FS und GS mit Null-Deskriptor laden
mov fs, ax
mov gs, ax
mov esp, 0x1FFFFF ;Stack auf unterhalb der 2 MB Grenze setzen
mov al,011h ; IRQ umleiten auf 20h damit keine Fehler ausgelöst wird.
out 020h,al
out 0A0h,al
mov al,20h
out 021h,al
mov al,28h
out 0A1h,al
mov al,4
out 021h,al
mov al,2
out 0A1h,al
mov al,1
out 021h,al
out 0A1h,al
sti
PMODE2:
jmp 0x8:0x10000 + PMODE2
Handler:
mov al,020h
out 020h,al
out 0A0h,al
iret
jmp Handler
Was ist daran falsch. Ich weiss nicht mehr weiter denn im Internet hat es nirgends ein Tutorial das nur eine IDT anlegt. Kann es sein, dass irgendwo im Code eine Exeption ausgelöst wird ? Bitte helft mir ich finde im Netz wirklich nichts und Englisch ist nicht so meine Sprache.
GROSSEN DANK
Dominik