我想创建一个自包含的C函数来打印字符串。这将是操作系统的一部分,因此我无法使用stdio.h
。如何创建一个函数来打印我传递给它的字符串而不使用stdio.h
?我是否必须在汇编中写出来?
答案 0 :(得分:4)
假设您在X86 PC上执行此操作,则需要直接读取/写入位于地址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
答案 1 :(得分:3)
您可能希望查看或可能只使用FreeBSD C库中的stdio functions的源代码,该库是BSD许可的。
要实际生成输出,您至少需要一些可以将字符写入输出设备的功能。为此,stdio例程最终调用write,它在内核中执行系统调用。