我正在编写一个操作系统。我在RAM(0xb8000)中创建了指向视频区域的指针。但是我在写入屏幕时遇到了一些问题。
要使其工作(仅写字母),我必须写偏移量为1的内存(例如mem[1] = char
,mem[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)
这些是我无法使用时看到的结果:
这是我自己打印X
时发生的情况。看来可行:
mem[2] = 'Z'
导致X
的颜色不同。进一步修改(如mem[4] = 'Z'
)从屏幕上删除所有这些字符
答案 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。