2016-12-17 8 views
2

i nasm verwende und das ist mein Code:int 10h 13h BIOS String Ausgabe funktioniert nicht

org 0x7c00 
bits 16 



section .data 
zeichen dw 'hello2' 
section .text 


mov ax,0x7c00 
mov es,ax 
mov bh,0 
mov bp,zeichen 

mov ah,13h 
mov bl,00h 
mov al,1 
mov cx,6 
mov dh,010h 
mov dl,01h 

int 10h 

jmp $ 

times 510 - ($-$$) hlt 
dw 0xaa55 

es den Cursor auf die richtige Position gesetzt ist, aber er druckt nichts. Ich lade diese Datei mit qemu-system-i386. Die int10 ah = 13h ist ein String-Ausgang und in Register es: bp muss die Adresse der Zeichenfolge sein

+0

Mehr als ein Problem. Sie müssen ein besseres Verständnis von Segment: Offset-Adressierung bekommen, aber ein Bootloader wird unter der physikalischen Adresse 0x07c00 geladen. Sie müssen eine ORG auswählen und segmentieren, die dieser Adresse entspricht. Wenn Sie ORG 0x7c00 auswählen, müssen Sie die Segmente (_ES_ in diesem Fall) auf Null setzen, da (0x0000 << 4) + 0x7c00 = 0x07c00 (physikalische Adresse). Sie laden _ES_ mit 0x7c00, was für die von Ihnen ausgewählte _ORG_ falsch ist. –

+0

Zweitens, wenn Sie '-f bin' _NASM_-Ausgabe verwenden, wollen Sie keinen' .data'-Abschnitt verwenden. Platzieren Sie die Daten innerhalb des 'text'-Bereichs direkt nach dem Code, aber vor der Boot-Signatur. Wenn Sie' section data' verwenden, platziert NASM Ihre Daten tatsächlich nach Byte 512 außerhalb des Boot-Sektors. –

+0

Sie setzen _BL_ auf 0x00. Das ist schwarz auf schwarz und wird nicht ausgegeben. Versuchen Sie 0x07 vielleicht? –

Antwort

1

Für zukünftige Referenz, da ich habe versucht, dies funktioniert für eine lange Zeit jetzt, hier ist ein Arbeitsversion!

org 0x7c00 
    bits 16 

    xor ax, ax 
    mov es, ax 
    xor bh, bh 
    mov bp, msg 

    mov ah, 0x13 
    mov bl, [foreground] 
    mov al, 1 
    mov cx, [msg_length] 
    mov dh, [msg_y] 
    mov dl, [msg_x] 

    int 0x10 

    hlt 

foreground dw 0xa 
msg db 'Beep Boop Meow' 
msg_length dw $-msg 
msg_x dw 5 
msg_y dw 2 

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

Hier ist eine Version am nächsten zum Original.

org 0x7c00 
    bits 16 

    ; video page number. 
    mov bh, 0  
    ; ES:BP is the pointer to string. 
    mov ax, 0x0 
    mov es, ax  
    mov bp, msg 

    ; attribute(7 is light gray). 
    mov bl, 0x7 
    ; write mode: character only, cursor moved. 
    mov al, 1 
    ; string length, hardcoded. 
    mov cx, 6 
    ; y coordinate 
    mov dh, 16 
    ; x coordinate 
    mov dl, 1 

    ; int 10, 13 
    mov ah, 0x13 
    int 0x10 

    ; keep jumping until shutdown. 
    jmp $ 

msg dw 'hello2' 

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