keine Ausgabe einer Zeichenkette im Kernel
-
Hallo ,
Also, nachdem ich mir Assembler angeeignet habe, will ich jetzt ein kleines OS schreiben.
Jedoch stoße ich schon an ein kleines Problem und ich kann mir die Ursache nicht erklären. Ich möchte in meinem OS einen kleinen Text ausgeben. Wenn ich dies im Bootloader einprogrammiere, ist es auch in Ordnung. Jetzt habe ich jedoch Bootloader und Kernel getrennt, wobei im Kernel die Zeichenkette dargestellt werden soll. Der Kernel wird zwar vom Bootloader geladen und es ist auch erkennbar, dass die Prozedur aufgerufen wird, die die Zeichenkette erstellt, aber der Text wird schlicht und einfach nicht angezeigt.Hier ist der Quelltext für NASM.
; boot.asm org 0x7C00 mov ax, 0x9000 call load_kernel jmp 0x1000:0x0000 load_kernel: xor ax, ax int 13h mov ax, 1000h mov es, ax mov ah, 02h mov al, 10 mov cl, 2 int 13h ret times 510-($-$$) hlt db 0x55 db 0xAA
; kernel.asm org 0x1000 mov ax,cs mov es,ax jmp main reboot: int 19h cls: mov ah, 00h mov al, 03h int 10h ret str_output: mov ah, 13h mov al, 1 mov bl, 2 int 10h ret main: call cls mov cx, msgend - msg mov bp, msg call str_output msg db "Hallo" msgend: times 512-($-$$) hlt
Weiß jemand, wo der Fehler liegt?
Danke im Voraus
florida
-
Dieser Thread wurde von Moderator/in Erhard Henkes aus dem Forum Projekt: OS-Development in das Forum Assembler verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Was passiert den nach dem call str_output?
-
florida schrieb:
Weiß jemand, wo der Fehler liegt?
Zwei Fehler:
- Int 10h Fn 13h erwartet in DH/DL die gewünschte Zeile/Spalte-Position.
- Nach 'call str_output' fährt das Programm ungebremst in den Datenbereich hinein. Auch ein 'hlt' hält nur bis zum nächsten Interrupt (Timer!). Du brauchst eine Endlosschleife.
So dürfte es funktionieren (getestet auf WinXP-Konsole):
main: call cls mov cx, msgend - msg mov bp, msg xor dx,dx call str_output jmp $ msg db "Hallo" msgend:
viele grüße
ralphEdit: Und noch einen dritten Fehler gefunden:
org 0x1000
Der "Kernel" wird wohl an Offsetadresse 0000 geladen, obwohl bei Int 13h Fn 02h die Belegung von BX und auch einiger anderer Register fehlt. Das muss NASM richtig mitgeteilt werden:
org 0x0000
-
Ja, danke an alle, die geantwortet haben!
Entscheidender Fehler war, dass statt org 0x1000 org 0x0000 dort hin musste.