我决定编写自己的bootloader。
我已经能够将视频模式设置为3(尽管qemu已将其设置为3),然后通过直接更改视频内存在屏幕第一行的第一个字符处打印“A”。 / p>
[org 0x7C00] ;Address BIOS loads the bootloader into
[bits 16]
;Set video mode to mode 3
mov al, 0x03
mov ah, 0x00
int 0x10
mov ax, 0xB800
mov es, ax
mov bx, 0
mov [es:bx], byte 65
mov [es:bx+1], byte 0x0F
;cli
JMP $ ;Infinite loop, hang it here.
times 510 - ($ - $$) db 0 ;Fill the rest of sector with 0
dw 0xAA55 ;Add boot signature at the end of bootloader
注意注释掉的cli指令。当我删除分号并且只删除分号时,不再打印“A”。我不明白如何清除IF标志会产生影响内存中的内容的副作用。如果有人能够对此有所了解,那就太棒了。
哦,为了它的价值,我用来运行引导程序的命令
nasm -o bl.bin bl.asm
qemu -fda bl.bin
我在其他地方被火烧了,尽可能多地读书。有人提到设置堆栈,但我不明白它与我的问题有关。
非常感谢帮助!
答案 0 :(得分:0)
取决于显卡硬件! 有些视频卡不直接支持所有视频模式,但只能模拟。 因此,通过中断,代码的内部部分负责将该存储器每隔几毫秒复制到图形卡存储器中。当您关闭中断时,您还将关闭图形卡上内部视频内存的刷新。 CLI指令禁用所有软件中断,因此只有硬件指令存在,因此BIOS无法正常工作。您只能将CLI指令用于同步读取或写入内存或IO端口。 为了确定我的答案,你可以在执行CLI指令之前暂停大约6ms,并显示字符。