Hallo Mal wider,
Ich habe in meinem OS versucht ne IDT zu erstellen. Nun, zum testen hab ich ersteimal nur für den int0 einen Eintrag erstellt. Zum Testen des Eintrags wollte ich einfach eine Division durch Null machen. Doch bochs sgtartet immer neu mit dem fehler:
Exception():3rd <13> exception with no resolution, shutdown status is 00h, resetting
Und hier noch ein auschnitt aus meinem code:
; =================[ PIC ]===============================
mov al, 00010001b
out 0x20, al
out 0xA0, al
mov al, 0x20
out 0x21, al
mov al, 0x28
out 0xA1, al
mov al, 00000100b
out 0x21, al
mov al, 0x02
out 0xA1, al
mov al, 00000001b
out 0x21, al
out 0xA1, al
mov al,0x0
out 0x21, al
out 0xA1, al
; =================[ Main ]==============================
call ClearScreen
mov esi, Msg_Welcome
call PutString
lidt [idt_pointer]
mov ax,330
mov dh,0
div dh
jmp $
; =================[ End ]===============================
cli ; disable interrupts.
hlt ; halt the cpu.
; =================[ Misc Data ]=========================
CursorPosition dd 0x00000000
Background db 0x0706
Msg_Welcome db ">>Welcome To Easy Operating System", 0
msga db "AAA"; 0
delay:
jmp .1
.1:
jmp .2
.2:
ret
ClearScreen:
mov ecx, 80 * 25
xor edx, edx
mov ax, 0x0018
mov es, ax
.1:
mov byte [es:edx], ' '
inc edx
push ax
mov al, [Background]
mov byte [es:edx], al
pop ax
inc edx
loop .1
mov word [CursorPosition], 0
mov ax, 0x0010
mov es, ax
retn
PutString:
mov edx, [CursorPosition]
mov ax, 0x0018
mov es, ax
.1:
lodsb
or al, al
jz short .2
mov byte [es:edx], al
inc edx
push ax
mov al, [Background]
mov byte [es:edx], al
pop ax
inc edx
jmp .1
.2:
mov [CursorPosition], dx
mov ax, 0x0010
mov es, ax
retn
retn
;Interrupt ServiceRoutines
int0t db "Division durch 0 !!!",0
int0x00:
cli
mov esi, int0t
call PutString
retn
int0x01:
cli
mov esi, int0t
call PutString
retn
int0x02:
cli
mov esi, int0t
call PutString
retn
int0x03:
cli
mov esi, int0t
call PutString
retn
int0x04:
cli
mov esi, int0t
call PutString
retn
int0x05:
cli
mov esi, int0t
call PutString
retn
int0x06:
cli
mov esi, int0t
call PutString
retn
int0x07:
cli
mov esi, int0t
call PutString
retn
int0x08:
cli
mov esi, int0t
call PutString
retn
int0x09:
cli
mov esi, int0t
call PutString
retn
int0x0a:
cli
mov esi, int0t
call PutString
retn
idt_pointer:
dw idt_end - idt - 1
dd idt
idt:
;int 0x00
dw int0x00
dw 0x10
dw 0x8E00
dw 0x0000
;int 0x01
dw int0x01
dw 0x10
dw 0x8E00
dw 0x0000
;int 0x02
dw int0x02
dw 0x10
dw 0x8E00
dw 0x0000
;int 0x03
dw int0x03
dw 0x10
dw 0x8E00
dw 0x0000
;int 0x04
dw int0x04
dw 0x10
dw 0x8E00
dw 0x0000
;int 0x05
dw int0x05
dw 0x10
dw 0x8E00
dw 0x0000
;int 0x06
dw int0x06
dw 0x10
dw 0x8E00
dw 0x0000
;int 0x07
dw int0x07
dw 0x10
dw 0x8E00
dw 0x0000
;int 0x08
dw int0x08
dw 0x10
dw 0x8E00
dw 0x0000
;int 0x09
dw int0x09
dw 0x10
dw 0x8E00
dw 0x0000
idt_end:
Kann mir jemand sagen, was ich falsch mache ?
Vielen Dank,
Mit Freundlichen güssen Togi