2013-08-31 75 views
3

我做了簡單的代碼,應該寫入VGA內存。x86彙編直接寫入VGA簡單操作系統

org 07c00h 
    mov eax,0xb8000 
    mov bx,msg 
    call printstr 
printstr: 


    mov al,byte[bx] 
    mov byte[eax],al 
    inc eax 
    mov byte[eax],1 
    inc eax 
    inc bx 
    cmp byte[bx],0 
    je end 
    jmp printstr 

end: 
    jmp end 
msg: db "Hello world!",0 
times 510-($-$$) db 0 
dw 0xaa55 

但是,當我在QEMU中運行它時,它不會寫「Hello world」。 我組裝了使用NASM。 Image

我想用「Hello world!」在第一行覆蓋前12個字符。

有誰知道爲什麼給我這個結果?

回答

3
mov al,byte[bx] 
    mov byte[eax],al 

aleax一部分,因此通過讀取一個字符al你搗毀你的屏幕上的指針。

除此之外,你不應該在你的引導程序中使用分段尋址?類似這樣的:

push 0xb800 
pop es 
xor di,di 
cld 
... 
stosb ; [es:di] = al, di++ 
+0

謝謝。我沒有使用分段尋址,因爲我不熟悉它,而且我不確定我是否理解它。 – Smax

+0

嗯,我從來沒有寫過x86操作系統或引導程序,但我猜測CPU是以實模式啓動的,因此,在切換到保護模式之前,您必須使用分段地址。 – Michael

+0

自386開始,即使在實模式下也可以使用32位尋址。只有結果線性地址的前20位(或21位)纔會被使用。 – avakar