2013-03-09 12 views
6

文字列を出力する自己完結型のC関数を作りたいと思います。これはオペレーティングシステムの一部なので、stdio.hは使用できません。 stdio.hを使用せずに渡す文字列を出力する関数を作成するにはどうすればよいですか?私はそれをアセンブリで書く必要がありますか?文字列を印刷するための自己完結型Cルーチン

+0

お使いのオペレーティングシステムは何を見ますか? – md5

+1

あなたはstdio.hを見ていますか? – JuanPi

+0

@JuanPi OPは 'stdio.h 'を使うことはできないと言った。 – Rob

答えて

3

BSDライセンスを取得したFreeBSD Cライブラリのstdio functionsのソースを参照するか、場合によってはそれを使用するだけでよいでしょう。

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

+0

OPが「オペレーティングシステムの一部」であることを希望する場合、OPはそれを実装するオペレーティングシステムコールを合理的に使用できません。 –

+0

@IraBaxter:はい。それは彼が実装する必要がある部分です。彼は* BSDカーネルと呼んでいないことは明らかでした。 – sfstewman

+1

あなたは基本的に、CライブラリをホビーOSに移植することについて話していますが、これは一般的なことですが、OPのためのかなり道のりです。彼はおそらくビデオメモリに直接読み書きすることから始めるべきです。 –

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

+3

これは "文字マップ"ビデオメモリを実装しているシステム/グラフィックスカードでのみ可能です。 「VGA」タイプのBIOSを搭載したグラフィックスカードを搭載したx86/x64ベースのマシンなどのPCハードウェアを除き、これはそうではありません。 PCタイプのグラフィックスカード上の文字マップ機能は、カードハードウェアではなくBIOSによって実行されます。たとえば、RaspberryPIでこれを行うには、_Framebuffer Device Driver_を記述する必要があります。したがって、VGA BIOS機能の使用は、 'write()'システムコールによるコンソール型ドライバの使用とは大きく異なります。 –

関連する問題