指向视频内存(0xB8000)的指针有些奇怪

时间:2019-07-04 18:21:27

标签: c x86 osdev

我正在编写一个操作系统。我在RAM(0xb8000)中创建了指向视频区域的指针。但是我在写入屏幕时遇到了一些问题。

要使其工作(仅写字母),我必须写偏移量为1的内存(例如mem[1] = charmem[2] = colour)。而且效果很好。但是当我需要实现滚动时,我必须从内存的一部分复制到另一部分。在这里,我遇到了问题。我无法从内存中获取字符。同样,这个偏移量似乎很奇怪,但是没有它就无法工作。

void main() {
    volatile unsigned char* mem = 0xB8000;
    mem[0] = 'X';
    mem[1] = 0xf0; // black on white
    mem[2] = 'Z';
    mem[3] = 0xf0; // black on white
    mem[4] = mem[2]; // this line delete all prev letters from display (like shift them out of screen)
    mem[4] = 0xf0;
}

当我在没有行mem[4] = mem[2];的情况下启动它时,它将正常工作。但是在这行代码中,我得到了非常奇怪的结果,没有所有上一个字母(X和Z)

这些是我无法使用时看到的结果:

enter image description here

这是我自己打印X时发生的情况。看来可行:

enter image description here

mem[2] = 'Z'导致X的颜色不同。进一步修改(如mem[4] = 'Z')从屏幕上删除所有这些字符

1 个答案:

答案 0 :(得分:2)

this article中所述,文本模式存储器为屏幕上的每个字符占用两个字节。第一个是ASCII码字节,另一个是属性字节。

如果您尝试在屏幕上打印“ XZZ”,则代码应类似于:

void main()
{
  volatile unsigned char* mem = 0xB8000;
  mem[0] = 'X';
  mem[1] = 0xf0; // black on white
  mem[2] = 'Z';
  mem[3] = 0xf0; // black on white
  mem[4] = mem[2];
  mem[5] = 0xf0; // black on white
}

当然,要使其正常工作,您需要确保以32位编译,例如注释中建议的@@ MichaelPetch。