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

おそらく、BSD ライセンスの FreeBSD C ライブラリのstdio 関数のソースを参照するか、単に使用することをお勧めします。

実際に出力を生成するには、出力デバイスに文字を書き込める関数が少なくとも必要です。これを行うために、stdio ルーチンは最終的にwriteを呼び出します。これは、カーネルへの syscall を実行します。

于 2013-03-09T16:43:37.117 に答える