文字列を出力する自己完結型のC関数を作りたいと思います。これはオペレーティングシステムの一部なので、stdio.h
は使用できません。 stdio.h
を使用せずに渡す文字列を出力する関数を作成するにはどうすればよいですか?私はそれをアセンブリで書く必要がありますか?文字列を印刷するための自己完結型Cルーチン
答えて
BSDライセンスを取得したFreeBSD Cライブラリのstdio functionsのソースを参照するか、場合によってはそれを使用するだけでよいでしょう。
実際に出力を生成するには、出力デバイスに文字を書き込むことができる少なくともいくつかの関数が必要です。これを行うために、stdioルーチンは、writeを呼び出して、カーネルにsyscallを実行します。
OPが「オペレーティングシステムの一部」であることを希望する場合、OPはそれを実装するオペレーティングシステムコールを合理的に使用できません。 –
@IraBaxter:はい。それは彼が実装する必要がある部分です。彼は* BSDカーネルと呼んでいないことは明らかでした。 – sfstewman
あなたは基本的に、CライブラリをホビーOSに移植することについて話していますが、これは一般的なことですが、OPのためのかなり道のりです。彼はおそらくビデオメモリに直接読み書きすることから始めるべきです。 –
これを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
これは "文字マップ"ビデオメモリを実装しているシステム/グラフィックスカードでのみ可能です。 「VGA」タイプのBIOSを搭載したグラフィックスカードを搭載したx86/x64ベースのマシンなどのPCハードウェアを除き、これはそうではありません。 PCタイプのグラフィックスカード上の文字マップ機能は、カードハードウェアではなくBIOSによって実行されます。たとえば、RaspberryPIでこれを行うには、_Framebuffer Device Driver_を記述する必要があります。したがって、VGA BIOS機能の使用は、 'write()'システムコールによるコンソール型ドライバの使用とは大きく異なります。 –
- 1. 自己完結型PHPサーバ
- 2. 自己完結型JWT(オーソ)
- 3. 自己完結型ルビー "バイナリ"?
- 4. 印刷の文章を防ぐための自己スキャンコード
- 5. C文字列を印刷ジャンク文字
- 6. Tomcatが埋め込まれた自己完結型warファイル?
- 7. 印刷文字列 - C
- 8. 自己完結型.netコアWebアプリケーション
- 9. Docker内蔵自己完結型マイクロサービス
- 10. シンプルな自己完結型のObjective Cファイル
- 11. Cで文字を印刷するためのテキストの取得
- 12. 連結された文字列を印刷する
- 13. 印刷文字列
- 14. クロスプラットフォームの自己完結型HTMLアプリケーションを開発する
- 15. .NET Coreコンソールアプリケーションを自己完結型アプリケーションに変換する
- 16. reactxで自己完結型コンポーネントを実装する方法は?
- 17. 問題を解決する自己完結型.NetCore App
- 18. フォワード宣言または自己完結型ヘッダー?
- 19. C汎用印刷配列関数 - 文字列配列の印刷
- 20. 自己完結型の方程式レンダリングライブラリを探す
- 21. 文字列に格納されたユニバーサル文字(html)を印刷するC++
- 22. Ada:列挙型を小文字で印刷する方法
- 23. 文字列の印刷
- 24. 印刷文字列の逆
- 25. 文字列の印刷(アセンブリ)
- 26. スプリングブート/角度アプリ。完全に自己完結型のHTMLファイルをルーティングする
- 27. C++ランダムな文字を印刷する
- 28. 自己のプロジェクトのために非文字列
- 29. Python自己完結型のWebアプリケーションとサーバーですか?
- 30. コンソール出力の列の文字列にテキストを印刷するためのライブラリ
お使いのオペレーティングシステムは何を見ますか? – md5
あなたはstdio.hを見ていますか? – JuanPi
@JuanPi OPは 'stdio.h 'を使うことはできないと言った。 – Rob