0

我决定编写自己的引导加载程序。

我已经能够将视频模式设置为 3(尽管 qemu 已经将其设置为 3),然后通过直接更改视频内存在屏幕第一行的第一个字符处打印“A”。

[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

我在其他地方被激怒了,并尽可能多地阅读。有人提到设置堆栈,但我不明白这与我的问题有关。

非常感谢您的帮助!

4

1 回答 1

0

取决于显卡硬件!一些视频卡不直接支持所有视频模式,但它只支持模拟。因此,通过中断,代码的内部部分负责每隔几毫秒将此内存复制到显卡内存中。当您关闭中断时,您还将关闭显卡上内部视频内存的刷新。CLI 指令禁用所有软件中断,因此仅存在硬件指令,因此 BIOS 将无法正常工作。您只能使用 CLI 指令来同步读取或写入内存或 IO 端口。为了确定我的回答,您可以在执行 CLI 指令之前暂停大约 6 毫秒,然后将显示字符。

于 2010-06-03T08:46:54.683 回答