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



如果我使用:

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

设置视频模式,然后:

mov dword [0xb8000], 0x0769

要将字符打印到VGA缓冲区,它没有任何作用。

我从网站上得到的信息太旧了吗?或者我做错了什么?

实际模式下的偏移量限制为0xFFFF。这不是我们所熟悉和喜爱的平坦的32位地址空间。将代码与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

相关内容

  • 没有找到相关文章

最新更新