自包含C例程来打印字符串

时间:2013-03-09 16:06:30

标签: c assembly operating-system osdev

我想创建一个自包含的C函数来打印字符串。这将是操作系统的一部分,因此我无法使用stdio.h。如何创建一个函数来打印我传递给它的字符串而不使用stdio.h?我是否必须在汇编中写出来?

2 个答案:

答案 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,它在内核中执行系统调用。