Autor Thema: Fragen zum PMode und IDT  (Gelesen 13218 mal)

Hauke

  • Beiträge: 113
    • Profil anzeigen
Gespeichert
« am: 08. June 2005, 10:35 »
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. :?:

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 08. June 2005, 13:40 »
Musst du nicht nach Interrupts ein IRET ausfuehren? Auch Exceptions sind Interrupts in gewissem Sinne und den Timerinterrupt musst du ja auch verarbeiten...
Einfach Nullen eintragen ist IMHO nicht gerade die beste Lösung...

Svenska

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #2 am: 08. June 2005, 13:48 »
Also allgemein musst du alles belegen bis zu deinem Maxi-Wert, auch Exceptions brauchen nen Handle. Das STI und CLI ist meines Wissens nur um die IRQs zu sperren, also Exceptions gehen sowieso noch und softwareaufrufe glaub ich auch.
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

Hauke

  • Beiträge: 113
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 09. June 2005, 17:28 »
Mit dem Iret hab ich nicht gemacht, weil ich eine Dauerschleife ausführe.
Und muss man denn jetzt für die reservierten Exceptions Nullen schreiben?
Zum Code ich hab mich vertippt ich hab statt lidt lldt geschrieben, aber ein anderer Fehler war noch dar, nämlich die Falsche Offsetadressse was ich hiermit korrigiert habe

        ;vor dem PMode
mov     eax, cs
shl eax, 4


mov si, idts
mov ecx, 33
idv:
xor edx,edx
mov dx, [si]
cmp dx, 0
je son
add edx, eax
mov [si], dx
add si, 6
shr edx, 16
mov [si], dx
inc si
inc si
loop idv
jmp schl
son:
add si, 8
loop idv
schl:

Aber wenn ich einen Fehler produziere, stürzt der Rechner ab, statt  in die Dauerschleife.
Was ist den noch Falsch? :?:

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #4 am: 09. June 2005, 17:37 »
Du darfst NICHT 0er schreiben, sondern brauchst für die belegten Interrupts auch eigene Handles!!!
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

 

Einloggen