Bootloader geht nicht



  • Hi,

    hab mir mal einen kleinen Bootloader geschrieben, um etwas mehr Erfahrung zu sammeln, aber er funktioniert nicht. 😞
    In Bochs zeigt er immer a b c an und dann gehts net weiter 😞

    [BITS 16]
    [ORG 0x7C00]
    
    jmp start  ; Daten und Funktion überpringen
    
    ; *** Variablen ***
    bootlaufwerk db 0
    
    ; *** Meldungen ***
    msginfo              db 'a', 13, 10, 0
    msgcpuerkennungstart db 'b', 13, 10, 0
    msgcpu386ok          db 'c', 13, 10, 0
    msgcpu386fehler      db 'd', 13, 10, 0
    msgneustart          db 'e', 13, 10, 0
    msginitkernel        db 'f', 13, 10, 0
    
    cpuerkennung:
            mov si, msgcpuerkennungstart  ; Meldung anzeigen
            call zeigetext
    
            pushf                         ; Probe auf 8088/8086 (Bits 12-15 gesetzt)
    
            xor ah, ah  ; = if (ah == 0)
            push ax
            popf
    
            pushf
            pop ax
            and ah, 0F0h
            cmp ah, 0F0h
            je cpu386fehler               ; Kein 386 verfuegbar!
    
            mov ah, 0F0h                  ; Probe auf 286 (Bits 12-15 leer)
            push ax
            popf
    
            pushf
            pop ax
            and ah, 0F0h
            jz cpu386fehler               ; Kein 386 verfuegbar!
    
            ; Wenn wir hier ankommen, haben wir einen 386 oder besser zur Verfuegung
            mov si, msgcpu386ok  ; OK-Meldung anzeigen
            call zeigetext
    
            ret  ; Aus Funktion zurueckspringen
    
    cpu386fehler:
            mov si, msgcpu386fehler
            call zeigetext
            jmp neustart
    
    zeigetext:  ; Zeigt Text auf dem Bildschirm an
            lodsb               ; Einen Buchstabe ins al Register laden
            or al, al           ; Wenn Buchstabe 0 ist, ...
            jz zeigetextfertig  ; ... sind wir fertig!
            mov ah, 0Eh         ; Der Buchstabe
            mov bx, 0007        ; Farbe weiss
            int 0x10            ; Text mit BIOS-Interupt schreiben
            jmp zeigetext       ; Und naechster Buchstabe!
    
    zeigetextfertig:
            ret                 ; Aus Funktion zurueckspringen
    
    warteauftaste:  ; Wartet auf Tastendruck
            mov ah, 0  ; Attribut setzen
            int 0x16   ; Interupt aufrufen
            ret        ; Aus Funktion zurueckspringen
    
    neustart:  ; Zeigt eine Meldung und startet nach Tastendruck den PC neu
            mov si, msgneustart  ; Meldung laden
            call zeigetext       ; Meldung zeigen
            call warteauftaste   ; Auf Tastendruck warten
    
            db 0EAh              ; Restart wird ...
            dw 0000h             ; ... hier eingestellt ...
            dw 0FFFFh            ; ... und ausgeführt!
    
    ; *** Einsprungpunkt ***
    start:
            mov [bootlaufwerk], dl  ; Unser Bootlaufwerk speichern
    
            cli                     ; Interupts abschalten
            mov ax, 0x9000          ; Ort fuer den Stack
            mov ss, ax
            mov sp, 0xFFFF
            sti                     ; Interupts wieder anschalten
    
            mov si, msginfo
            call zeigetext
    
            call cpuerkennung
    
    .386
    
        mov si, msginitkernel
        call zeigetext
    
            hlt                     ; Prozessor abschalten!
    
    TIMES 510-($-$$) DB 0
    SIGNATURE DW 0xAA55
    

    ChrisM



  • Hi.

    Soweit ich das sehe, returst Du aus der CPU-Erkennungs proc ins Nirvana.
    Das pushf vom Anfang der Proc wird vor dem ret nicht vom stack geholt. 😉



  • Danke, was ein popf so ausmachen kann... 😃

    ChrisM



  • ja ja, beim Poppen *g* sollte man eigentlich immer aufpassen (...)



  • Löl 😃

    ChrisM

    PS: Woran kann das liegen, wenn in Bochs beim Emulieren bestimmte Zeichen in Strings falsch dargestellt werden? Also z.B. andere ASCII-Zeichen, z.B. das Smilie-Zeichen, dargestellt werden? Printfunktion ist richtig und Text stimmt auch in der Executable! (mit Hexeditor nachgeschaut)


Anmelden zum Antworten