6

我想制作一个打印字符串的自包含 C 函数。这将是操作系统的一部分,所以我不能使用stdio.h. 我将如何制作一个函数来打印我传递给它的字符串而不使用stdio.h?我必须在汇编中编写它吗?

4

2 回答 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 回答