写入 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
如果我使用:
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