Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: syxce am 01. December 2005, 12:58
-
Hallo,
Ich habe mir eure Tutorials durch gelesen und auch probiert, der Bootloader und der Kernel nach der ersten Ausgabe von LowLevel haben noch funktioniert,
doch als ich die Interrupt Routine aus LowLevel3 eingebaut habe zeigt er mir auf dem Monitor nur die Texte an die mit putstr ausgegeben werden, diejenigen die ich mit dem interrupt ausgebe nicht ?
Ich habe den Code des Bootloaders und des Kernels angefügt.
Danke im voraus
mfg syce
Kernel:
mov ax, 1000h
mov ds, ax
mov es, ax
start:
mov si, msg
mov al, 0x01
int 0x21
mov si, msg_boot
call putstr
call getkey
jmp reboot
msg db "Interrupt ausgeführt",13,10,0
msg_boot db "Ausgabe mit putstr, Taste drücken um neu zu starten",13,10,0
_int0x21:
_int0x21_ser0x01: ; funktion 0x01
cmp al, 0x01 ; funktion 0x01 angefragt?
jne _int0x21_end ; nächste Routine checken
_int0x21_ser0x01_start:
lodsb ; nächstes Byte laden
or al, al ; 0-Byte?
jz _int0x21_ser0x01_end
mov ah, 0x0E ; BIOS Teletype
mov bh, 0x00 ; Page 0
mov bl, 0x07 ; Text-Attribute
int 0x10 ; BIOS-Call
jmp _int0x21_ser0x01_start
_int0x21_ser0x01_end:
jmp _int0x21_end
_int0x21_end:
iret
push dx
push es
xor ax, ax
mov es, ax
cli
mov word [es:0x21*4], _int0x21 ; Pointer auf den Handler
mov [es:0x21*4+2], cs ; Pointer auf CS
sti
pop es
pop dx
putstr:
lodsb
or al, al
jz short putstrd
mov ah, 0x0E
mov bx, 0x007
int 0x10
jmp putstr
putstrd:
retn
getkey:
mov ah, 0
int 016h
ret
reboot:
db 0EAh
dw 0000h
dw 0FFFFh
Bootloader:
org 0x7C00
start:
cli
mov ax, 0x9000
mov ss, ax
mov sp, 0
sti
mov [bootdrv], dl
call kernel
mov ax, 0x1000
mov es, ax
mov ds, ax
push ax
mov ax,0
push ax
retf
bootdrv db 0
loadmsg db "Loading...",13,10,0
putstr:
lodsb
or al, al
jz short putstrd
mov ah, 0x0E
mov bx,0x0007
int 0x10
jmp putstr
putstrd:
retn
kernel:
push ds
mov ax, 0
mov dl, [bootdrv]
int 13h
pop ds
jc kernel
load:
mov ax,0x1000
mov es, ax
mov bx,0
mov ah, 2
mov al, 5
mov cx, 2
mov dx, 0
int 13h
jc load
mov si, loadmsg
call putstr
retn
times 512-($-$$)-2 db 0
dw 0AA55h
-
du musst dein intoffset in die ivt einfügen, bevor du den int aufrufst.
dh.:
start:
cli
; erst routine eintragen
xor ax, ax
mov es, ax
mov word [es:0x21*4], _int0x21 ; Pointer auf den Handler
mov [es:0x21*4+2], cs; Pointer auf CS
mov ax, 1000h
mov ds, ax
mov es, ax
sti
; dann aufrufen
mov si, msg
mov al, 0x01
int 0x21
usw...
-
Jetzt sieht mein Kernel wie folgt aus, jedoch erhalte ich jetzt gar keine Ausgabe mehr, er reagiert nicht einmal auf den Tastendruck um neu zu starten :?:
start:
_int0x21:
_int0x21_ser0x01: ; funktion 0x01
cmp al, 0x01 ; funktion 0x01 angefragt?
jne _int0x21_end ; nächste Routine checken
_int0x21_ser0x01_start:
lodsb ; nächstes Byte laden
or al, al ; 0-Byte?
jz _int0x21_ser0x01_end
mov ah, 0x0E ; BIOS Teletype
mov bh, 0x00 ; Page 0
mov bl, 0x07 ; Text-Attribute
int 0x10 ; BIOS-Call
jmp _int0x21_ser0x01_start
_int0x21_ser0x01_end:
jmp _int0x21_end
_int0x21_end:
iret
msg db "Interrupt",13,10,0
cli
; erst routine eintragen
xor ax, ax
mov es, ax
mov word [es:0x21*4], _int0x21 ; Pointer auf den Handler
mov [es:0x21*4+2], cs ; Pointer auf CS
mov ax, 1000h
mov ds, ax
mov es, ax
sti
mov si, msg
mov al, 0x01
int 0x21
mov si, msg_boot
call putstr
call getkey
jmp reboot
msg_boot db "Press any key to reboot...",13,10,0
putstr:
lodsb
or al, al
jz short putstrd
mov ah, 0x0E
mov bx, 0x007
int 0x10
jmp putstr
putstrd:
retn
getkey:
mov ah, 0
int 016h
ret
reboot:
db 0EAh
dw 0000h
dw 0FFFFh
-
Schau mal im Bochs-Debugger nach, oder probiere den Fehler mit "call pustr" abzustecken. Also nach dem ersten Befehl cal... hin, wenn etwas angezeigt wird, dann beim zweiten Befehl ein call... hin. Sobald nichts mehr ausgegeben wird, weisst du, wo der Fehler ist.
-
Ich verwende Bochs nicht, ich schreibe die beiden Dateien jedes mal als Image auf die Diskette und probiere es bei einem zweiten rechner aus.
-
mov ax, 1000h
mov ds, ax
mov es, ax
push dx ;wieso dx? meinst du ax?
push es
xor ax, ax
mov es, ax
cli
mov word [es:0x21*4], _int0x21 ; Pointer auf den Handler
mov [es:0x21*4+2], cs ; Pointer auf CS
sti
pop es
pop dx
start:
mov si, msg
mov al, 0x01
int 0x21
mov si, msg_boot
call putstr
call getkey
jmp reboot
msg db "Interrupt ausgeführt",13,10,0
msg_boot db "Ausgabe mit putstr, Taste drücken um neu zu starten",13,10,0
_int0x21:
_int0x21_ser0x01: ; funktion 0x01
cmp al, 0x01 ; funktion 0x01 angefragt?
jne _int0x21_end ; nächste Routine checken
_int0x21_ser0x01_start:
lodsb ; nächstes Byte laden
or al, al ; 0-Byte?
jz _int0x21_ser0x01_end
mov ah, 0x0E ; BIOS Teletype
mov bh, 0x00 ; Page 0
mov bl, 0x07 ; Text-Attribute
int 0x10 ; BIOS-Call
jmp _int0x21_ser0x01_start
_int0x21_ser0x01_end:
jmp _int0x21_end
_int0x21_end:
iret
putstr:
lodsb
or al, al
jz short putstrd
mov ah, 0x0E
mov bx, 0x007
int 0x10
jmp putstr
putstrd:
retn
getkey:
mov ah, 0
int 016h
ret
reboot:
db 0EAh
dw 0000h
dw 0FFFFh
-
Es Funktioniert.
Vielen Dank allen, besonders bitmaster.
mfg syxce