Autor Thema: IDT Prob...(asm)  (Gelesen 5503 mal)

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« am: 16. June 2005, 22:13 »
Hallo,
Ich arbeite mit fasm und hab mal versucht auch damit ne IDT aufzustellen das hat damals nicht so ganz funktioniert, da hab ich's aufgegeben, heute habe ich den Code wieder rausgekramt und etwas herumprobiert, aber erfolglos, daher wollte ich mal hier fragen. Der Code sieht so aus:

macro IdtEntry Isr
{
dw Isr and 0xffff
dw 0x0008
db 00000000b
db 10001110b
dw Isr shr 16
}

macro Exception Message
{
pusha
push gs
push fs
push ds
push es

mov esi, Message
call PutString
cli
hlt

pop es
pop ds
pop fs
pop gs
popa
iret
}

InterruptDescriptorTable:
dw EndOfIdtEntries - IdtEntries -1
dd IdtEntries

IdtEntries:
IdtEntry Isr1
[...]
IdtEntry Isr33
EndOfIdtEntries:

Isr0: Exception Msg_Exception_1
[...]
Isr31: Exception Msg_Exception_32
Isr32:
pusha
push gs
push fs
push ds
push es

push String_Header
push 0x1f
call PutString

pop es
pop ds
pop fs
pop gs
popa
iret
Isr33:
pusha
push gs
push fs
push ds
push es

;xor eax, eax
;in al, 0x60
;call PutChar
push String_Header
call PutString
;mov al, 0x20
;out 0xA0, al
;out 0x20, al

pop es
pop ds
pop fs
pop gs
popa
iret


die IDT wird so geladen:

lidt [InterruptDescriptorTable]
sti

Nun beschwert sich Bochs aber, dass diese IDT ungültig ist, hat da jemand ne Idee?

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #1 am: 17. June 2005, 11:49 »
Scheinbar machst du einen Fehler beim DD des Pointers. Es handelt sich nicht um die Anzahl der Einträge (währe auch viel zu wenig fürn DD) sondern um die physische/virtuelle Adresse der Tabelle im Speicher. Damit ist der Pointer unabhängig von der Struktur GDT/IDT an sich.

Quelle: Mein OS und http://osdever.net/tutorials/interrupts.3.php?the_id=41
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,...

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 17. June 2005, 15:18 »
O_O Ich dachte, das sollte  ein Pointer auf die LÄNGE (nicht die Anzahl) der Einträge und die Position der IDT sein...
so verstehe ich das auch auf osdever.net:

idt_pointer:
dw end_of_idt - start_of_idt - 1
dd start_of_idt

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #3 am: 17. June 2005, 15:26 »
Jap, isses auch. Sehe grade, dass du da ein Label hast... Dachte, das währe ein equ oder sowas, is auchn bisschen komisch benannt. ;) Eigendlich müsste es so, wie du's hast schon stimmen... Kopier das Teil doch einfach an eine fixe Adresse im Speicher, du wirst es eh ändern während der Lauftzeit, und setzt den Pointer fest darauf. Bei mir funktioniert das. Was passiert am Real-PC?
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,...

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 17. June 2005, 15:27 »
Das selbe wie bei Bochs neben der Error Msg es werden 2 Zeichen ausgegeben mit so rosa-hintergrund (die Zeichen sind bei Bochs und beim PC verschieden).

 

Einloggen