hi,
ein neues problem macht mir zu schaffen. und zwar gehts um das laden der interrupt descriptor table und das zuweisen einer interrupt service routine. hab bis jetzt nur einen eintrag für den interrupt 0 in meiner idt. wenn ich den interrupt im code aufrufe, rebootet bochs ohne in die interrupt service routine zu springen.
%include "config32.asm"
[BITS 16]
org 0x7c00
init:
xor ax, ax
mov ds, ax
mov es, ax
mov ax, 0100h
mov ss, ax
mov ax, STACK_ADR
mov sp, ax ; relative adressing to stack segment
;; set gdt
cli ; disable interrupts
lgdt [gdt_desc]
mov eax, cr0
or eax, 1
mov cr0, eax
jmp gdt_code:pmode
[BITS 32]
pmode:
mov ax, gdt_data
mov ds, ax
mov ss, ax
mov es, ax
mov esp, STACK_ADDRESS
;; fill up idt
lidt [idt_desc] ; load idt
mov eax, isr0
mov [idt], ax ; assign lower word
shr eax, 16
mov [idt+6], ax ; assign upper word (**)
sti ; reenable interrupts
int 0 ; interrupt
isr0:
cli
hlt
iret
;; -----------------------------
;; global descriptor table
;; -----------------------------
gdt:
dd 0
dd 0
gdt_code equ $-gdt
dw 0ffffh
dw 0
db 0
db 10011010b
db 11001111b
db 0
gdt_data equ $-gdt
dw 0ffffh
dw 0
db 0
db 10010010b
db 11001111b
db 0
gdt_end:
;; gdt descriptor
gdt_desc:
dw gdt_end-gdt-1
dd gdt
;; --------------------------------
;; interrupt descriptor table
;; --------------------------------
;; idt descriptor
idt_desc:
dw idt_end-idt-1
dd idt
idt:
dw 0 ; filled up at runtime: isr0 & ffffh
dw gdt_code ; gdt selector
dw 8e00h ; access, attributes
dw 0 ; filled up at runtime: isr0 >> 16
idt_end:
times 510-($-$$) db 0
dw 0aa55h
;; size = 512B
über den inhalt von idt meint bochs:
<bochs:29> info idt 0
Interrupt Descriptor Table (base=0x00007cb6):
IDT[0x00]=??? descriptor hi=0x00000000, lo=0x00087c7e
wo könnte das problem begraben liegen?
EDIT: argl, hatte bei (**) vorher 4 statt 6 stehn. dadurch hab ich mir natürlich die access/attribut-flags zerschossen.
bitte posting entweder löschen, oder falls der code hilfreich erscheint halt einfach stehn lassen