写入 0x000B8000 处的内存映射 VGA 不打印字符

Writing to memory mapped VGA at 0x000B8000 doesn't print characters

如果我使用:

mov ah, 0x00
mov al, 0x03
int 0x10

设置视频模式,然后:

mov dword [0xb8000], 0x0769

将字符打印到 VGA 缓冲区它不会执行任何操作。

我从网站获得的信息是否太旧?还是我做错了什么?

实模式下的偏移量限制为0xFFFF。这不是我们熟悉和喜爱的平面 32 位地址 space。使用 NASM 2.14.02 汇编您的代码会生成此机器代码(显示 ndisasm 反汇编):

66 C7 06 0080 69070000   mov dword [0x8000],0x769
******************       warning: word data exceeds bounds [-w+number-overflow]

如果您的 NASM 版本或您正在使用的任何汇编器没有警告您犯了这个错误,请更新它或使用它的警告选项。


改为做什么

相反,将 ES 设置为 0xB800 并将其用作段:

mov ax, 0xb800
mov es, ax
mov word [es: 0], 0x0769

附带说明一下,文本模式下的单个屏幕字符对应于显存中的 WORD,而不是 DWORD。一个字节用于字符,另一个字节用于属性。


如果您试图覆盖 地址 大小而不是操作数大小,则使用带有地址大小前缀的 DWORD 地址:这是可能的,但不会这样做你想要什么。段限制仍然是 64k。但仅作记录,NASM 语法是

mov  word [dword 0xb8000], 0x0769      ; will #GP fault because of segment limit
; 67 C7 05 00800B00 6907