【发布时间】:2019-07-04 18:21:27
【问题描述】:
我正在编写一个操作系统。我在 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]; 行的情况下启动它时,它可以正常工作。但是通过这一行,我得到了非常奇怪的结果,没有所有 prev 字母(X 和 Z)
这些是我在它不起作用时看到的结果:
当我自己打印X 时会发生这种情况。它似乎工作:
mem[2] = 'Z' 导致X 的颜色不同。并进一步修改(如mem[4] = 'Z')从屏幕上删除所有这些字符
【问题讨论】:
-
重复是关于为一种架构生成代码但在另一种架构中运行代码。我相信在这个问题中观察到的输出很可能是因为您将代码编译为 64 位,然后在 32 位保护模式下运行它。 64 位代码无法在 32 位代码中正常运行。它可能看起来在运行,但它会做一些不寻常的事情。在操作系统开发中,它通常在写入显示器时以可观察的方式表现出来。您看到的屏幕异常非常能说明这一点。另一个问题有一些解决方案的答案。