Autor Thema: Keine Ausgabe  (Gelesen 4026 mal)

syxce

  • Beiträge: 45
    • Profil anzeigen
Gespeichert
« 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

maumo

  • Beiträge: 182
    • Profil anzeigen
    • http://maumo.50webs.com/
Gespeichert
« Antwort #1 am: 01. December 2005, 14:53 »
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...

syxce

  • Beiträge: 45
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 01. December 2005, 16:12 »
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

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 01. December 2005, 17:52 »
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.

syxce

  • Beiträge: 45
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 01. December 2005, 17:56 »
Ich verwende Bochs nicht, ich schreibe die beiden Dateien jedes mal als Image auf die Diskette und probiere es bei einem zweiten rechner aus.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #5 am: 01. December 2005, 18:03 »
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
In the Future everyone will need OS-64!!!

syxce

  • Beiträge: 45
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 01. December 2005, 18:11 »
Es Funktioniert.
Vielen Dank allen, besonders bitmaster.

mfg syxce

 

Einloggen