2016-08-02 47 views
1

Als ein pädagogisches Projekt habe ich beschlossen, einen sehr einfachen Boot-Loader zu schreiben. Ein Boot-Loader, der nichts startet, aber eine Nachricht anzeigt. Aus irgendeinem Grund kann ich in den Videospeicher schreiben, aber der ASCII-Wert des letzten Buchstabens ist 7 größer als es sein sollte und ein Zitat folgt der Nachricht.Writting zu 0xB800 im 16-Bit-Modus zeigt ein "G" und ein Zitat

Hier ist mein Code:

bits 16 ; 16-bit Real Mode 
org 0x7c00 ; BIOS boot origin 

jmp main ;Jump to start main() entry-point 

main: 
    mov ax, 0xB800 
    mov ds, ax 
    mov si, 0x0 
    mov [si], byte 'A' 
    add si, 2 
    mov [si], byte 'A' 
    add si, 2 
    mov [si], byte 'A' 
    add si, 2 
    mov [si], byte 'A' 
    add si, 2 
    mov [si], byte 'A' 

    hlt 

times 510 - ($-$$) db 0 
dw 0xAA55 

Hier ist der Ausgang:

AAAAH" 
+4

Lesen Sie, was 'hlt' tut. Hinweis: Ein Interrupt kann es aufwecken, so dass Ihr Programm fortgesetzt wird und wahrscheinlich auf einen Befehl trifft, der diesen Effekt hat. PS: Lerne einen Debugger zu benutzen. – Jester

+0

Was ist deine Frage? – adrianmcmenamin

+0

Versuchen Sie, jmp $ anstelle von Halt zu verwenden. – rcgldr

Antwort

0

Ok, Ändern hlt zu jmp $ das Problem gelöst. Hier ist der Arbeitscode:

bits 16 
org 0x7c00 

main: 
    mov ax, 0xB800 
    mov ds, ax 
    mov si, 0x0 
    mov [si], byte 'A' 
    add si, 2 
    mov [si], byte 'A' 
    add si, 2 
    mov [si], byte 'A' 
    add si, 2 
    mov [si], byte 'A' 
    add si, 2 
    mov [si], byte 'A' 

    jmp $ 

times 510 - ($-$$) db 0 
dw 0xAA55