我想制作一个打印字符串的自包含 C 函数。这将是操作系统的一部分,所以我不能使用stdio.h
. 我将如何制作一个函数来打印我传递给它的字符串而不使用stdio.h
?我必须在汇编中编写它吗?
问问题
304 次
2 回答
4
假设您在 X86 PC 上执行此操作,您需要直接读取/写入位于 address 的视频内存0xB8000
。对于彩色显示器,您需要指定一个 ASCII 字符字节和一个属性字节,它们可以指示颜色。访问此内存时通常使用宏:
#define VIDEO_BASE_ADDR 0xB8000
#define VIDEO_ADDR(x,y) (unsigned short *)(VIDEO_BASE_ADDR + 2 * ((y) * SCREEN_X_SIZE + (x)))
然后,围绕它编写自己的 IO 例程。下面是我用来从屏幕缓冲区写入的一个简单函数。我用它来帮助实现粗略的滚动功能。
void c_write_window(unsigned int x, unsigned int y, unsigned short c)
{
if ((win_offset + y) >= BUFFER_ROWS) {
int overlap = ((win_offset + y) - BUFFER_ROWS);
*VIDEO_ADDR(x,y) = screen_buffer[overlap][x] = c;
} else {
*VIDEO_ADDR(x,y) = screen_buffer[win_offset + y][x] = c;
}
}
要了解有关此内容和其他 osdev 主题的更多信息,请参阅http://wiki.osdev.org/Printing_To_Screen
于 2013-03-10T02:51:36.860 回答
3
您可能想要查看或可能只是使用FreeBSD C 库中的stdio 函数的源代码,它是 BSD 许可的。
要实际产生输出,您至少需要一些可以将字符写入输出设备的功能。为此,stdio 例程最终会调用write,后者会对内核执行系统调用。
于 2013-03-09T16:43:37.117 回答