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:

    1. Int 10h Fn 13h erwartet in DH/DL die gewünschte Zeile/Spalte-Position.
    2. 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
    ralph

    Edit: 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.


Anmelden zum Antworten