Voila
[BITS 16]
;16 Bit Code erstellen
jmp start ;GDT überspringen
%macro makeIDT 3
dw %1
dw %2
db 0
db %3
dw 0
%endmacro
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
idts:
makeIDT IRQ_00, 8, 10001110b
makeIDT IRQ_00, 8, 10001110b
makeIDT IRQ_00, 8, 10001110b
makeIDT IRQ_00, 8, 10001110b
makeIDT IRQ_00, 8, 10001110b
makeIDT IRQ_00, 8, 10001110b
makeIDT IRQ_00, 8, 10001110b
makeIDT IRQ_00, 8, 10001110b
makeIDT IRQ_00, 8, 10001110b
makeIDT IRQ_00, 8, 10001110b
makeIDT IRQ_00, 8, 10001110b
makeIDT IRQ_00, 8, 10001110b
makeIDT IRQ_00, 8, 10001110b
makeIDT IRQ_00, 8, 10001110b
makeIDT IRQ_00, 8, 10001110b
makeIDT IRQ_00, 8, 10001110b
makeIDT IRQ_00, 8, 10001110b
makeIDT IRQ_00, 8, 10001110b
makeIDT IRQ_00, 8, 10001110b
makeIDT IRQ_00, 8, 10001110b
makeIDT IRQ_00, 8, 10001110b
makeIDT IRQ_00, 8, 10001110b
makeIDT IRQ_00, 8, 10001110b
makeIDT IRQ_00, 8, 10001110b
makeIDT IRQ_00, 8, 10001110b
makeIDT IRQ_00, 8, 10001110b
makeIDT IRQ_00, 8, 10001110b
makeIDT IRQ_00, 8, 10001110b
makeIDT IRQ_00, 8, 10001110b
makeIDT IRQ_00, 8, 10001110b
makeIDT IRQ_00, 8, 10001110b
makeIDT IRQ_01, 8, 10001110b
makeIDT IRQ_01, 8, 10001110b
idt:
Limiti dw 0 ;Größe der IDT (wird später eingetragen)
Basei dd 0 ;Adresse der IDT (wird später eingetragen)
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 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] ;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
jmp dword 0x8:PMODE
[BITS 32] ;32 Bit Code erstellen
PMODE:
mov eax, 2 ;Selektor für das Datensegment erstellen
shl eax, 3
mov ds, ax ;Daten- Stack- und Extrasegment mit Datensegmentdeskriptor laden
mov ss, ax
mov es, ax
mov eax, 0 ;FS und GS mit Null-Deskriptor laden
mov fs, ax
mov gs, ax
mov esp, 0x2FFFFF ;Stack setzen
jmp 0x8:0x10000 + PMODEy ;Sprung in das "neue" Codesegment
PMODEy:
mov [Limiti], word idt - idts -1
mov eax, cs ;Startadresse der IDT errechnen
shl eax, 4
add eax, idts
mov [Basei], eax
lidt [idt] ; Neuinit der Interrupt-Controller, sowie neu Setzen des Interrupt Mappings
; Neuinit der Interrupt-Controller, sowie neu Setzen des Interrupt Mappings
mov al,00010001b ; kaskadierte Interrupt-Controller und Flankentriggerung an beider Controller
out 020h,al
out 0a0h,al
; neuer IRQ-Vektor für den ersten Controller einstellen neuer Wert => IRQ0..7 -> INT20h..27h
mov al,20h
out 021h,al
; neuer IRQ-Vektor für den zweiten Controller einstellen neuer Wert => IRQ8..15 -> INT28h..2Fh
mov al,28h
out 0a1h,al
; Kaskadierung beider Controller einstellen
mov al,00000100b ; Kaskadierung über IRQ2
out 021h,al
mov al,00000010b ; Kaskadierung über IRQ2
out 0a1h,al
; PIC auf Intel-Umgebung und manuelle Int.- Beendigung einstellen
mov al,00000001b
out 021h,al
out 0a1h,al
PMODE2:
jmp 0x8:0x10000 + PMODE2 ;Endlosschleife
IRQ_00:
cli
pusha
push gs
push fs
push ds
push es
mov al,20h
out 20h,al
pop es
pop ds
pop fs
pop gs
popa
iret
Gruss
Noooooooos