Ich hab noch ein paar Fragen zum ProtectMode einmal gibt es Speicheradressen, die reserviert sind (mit Ausnahme vom Videospeicher und dem Stack), wie im RealMode z. B. die Interrupt verctor tabel. Und jetzt noch eine Frage zu der IDT. Mann muss doch eine Routine Programmieren für die Exceptions 0-19. 20 - 31 sind doch reserviert also Nullen eintragen.
Und ein Int 32 Programmiert. Jetzt darf man doch "sti" machen und Int 32 aufrufen, nur bleibt er hängen und ich weiß nicht warum.
So sehen wichtige abschnitte meines Codes aus
sCODE equ 1000b
%macro makeIDT 3
dw %1
dw %2
db 0
db %3
dw 0
%endmacro
idts:
makeIDT IRQ_00, sCODE, 10001110b
makeIDT IRQ_01, sCODE, 10001110b
makeIDT IRQ_02, sCODE, 10001110b
makeIDT IRQ_03, sCODE, 10001110b
makeIDT IRQ_04, sCODE, 10001110b
makeIDT IRQ_05, sCODE, 10001110b
makeIDT IRQ_06, sCODE, 10001110b
makeIDT IRQ_07, sCODE, 10001110b
makeIDT IRQ_08, sCODE, 10001110b
makeIDT IRQ_09, sCODE, 10001110b
makeIDT IRQ_10, sCODE, 10001110b
makeIDT IRQ_11, sCODE, 10001110b
makeIDT IRQ_12, sCODE, 10001110b
makeIDT IRQ_13, sCODE, 10001110b
makeIDT IRQ_14, sCODE, 10001110b
makeIDT 0,0,0
makeIDT IRQ_16, sCODE, 10001110b
makeIDT IRQ_17, sCODE, 10001110b
makeIDT IRQ_18, sCODE, 10001110b
makeIDT IRQ_19, sCODE, 10001110b
makeIDT 0,0,0
makeIDT 0,0,0
makeIDT 0,0,0
makeIDT 0,0,0
makeIDT 0,0,0
makeIDT 0,0,0
makeIDT 0,0,0
makeIDT 0,0,0
makeIDT 0,0,0
makeIDT 0,0,0
makeIDT 0,0,0
makeIDT 0,0,0
makeIDT IRQ_32, sCODE, 10001110b
idt:
Limiti dw 0
Basei dd 0
mov eax, cs ;Startadresse der IDT errechnen
shl eax, 4
add eax, idts
mov [Basei], eax
mov [Limiti], word idt - idts -1
lldt [idt]
IRQ_00:
xor al, al
jmp irqA
IRQ_01:
mov al, 1
jmp irqA
IRQ_02:
mov al, 2
jmp irqA
IRQ_03:
mov al, 3
jmp irqA
IRQ_04:
mov al, 4
jmp irqA
IRQ_05:
mov al, 5
jmp irqA
IRQ_06:
mov al, 6
jmp irqA
IRQ_07:
mov al, 7
jmp irqA
IRQ_08:
mov al, 8
jmp irqA
IRQ_09:
mov al, 9
jmp irqA
IRQ_10:
mov al, 10
jmp irqA
IRQ_11:
mov al, 11
jmp irqA
IRQ_12:
mov al, 12
jmp irqA
IRQ_13:
mov al, 13
jmp irqA
IRQ_14:
mov al, 14
jmp irqA
IRQ_16:
mov al, 16
jmp irqA
IRQ_17:
mov al, 17
jmp irqA
IRQ_18:
mov al, 18
jmp irqA
IRQ_19:
mov al, 19
jmp irqA
IRQ_32:
xor si, si
mov ax,3
shl eax, 3
mov ds, ax
mov cl, 'h'
mov [si],cl
inc si
inc si
mov cl, 'a'
mov [si],cl
inc si
inc si
mov cl, 'l'
mov [si],cl
inc si
inc si
mov cl, 'l'
mov [si],cl
inc si
inc si
mov cl, 'o'
mov [si],cl
inc si
inc si
h:
xor si, si
jmp h
irqA:
xor si, si
mov cl, al
mov ax,3
shl eax, 3
mov ds, ax
mov [si],cl
jmp irqA
(Der Selektor DS zeigt auf einen Video Deskreptator)
Und dann rufe ich Int 32 auf und nur der Cursor blinkt.