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