Cのライブラリ関数なしで変数の文字、文字列、または値をどのように印刷しますか?
質問
たとえば、printf、putcharなどの標準ライブラリ関数を使用すべきではない場合、どうすれば画面に文字を簡単に印刷できますか。それを行う簡単な方法はありますか。システムコールについてあまり知りませんが、システムコールを使用する必要がある場合はどうすればよいですか?
では、ライブラリ関数を使用せずに簡単に印刷する方法をアドバイスできますか?
解決 3
ウルの回答に感謝します。質問の下にあるハオ氏のコメントで簡単な答えを見つけました。彼の答えはこのような簡単なプログラムです
Turbo C(DOSプログラム):
char far* src = (char far*) 0xB8000000L;
*src = 'M';
src += 2;
*src = 'D';
またはこれを試してください: http://en.wikipedia.org/wiki/Brainfuck :) <!>#8211; // Hao(1時間前)
Turbo Cとその動作で試しました。 私はこのような簡単な解決策を望んでおり、それを正しい答えとして受け入れたかったのですが、彼(ハオ)はコメントとしてそれを与えたので、他のユーザーが彼に代わってこれを知って受け入れるようにここに貼り付けました。もう一度、ミスター・ハオに感謝します。
他のヒント
標準Cでは、できません。 Cで定義されているI / Oは、C標準ライブラリ関数のみです。
特定のプラットフォームでは、それを行う方法があります。
- カーネルを直接呼び出します。これを行うには、おそらくいくつかのインラインアセンブリを記述する必要があります。 Cライブラリを使用せずに、litbの
write
呼び出しを直接行うことができます。 Cライブラリのソースを取得して、それがどのように行われたかを確認します。 - フレームバッファに直接書き込みます。マルチユーザーOSでは、これが許可されないことがよくあります(少なくともライブラリ/カーネル呼び出しを行わない場合)。
独自のCライブラリを書いているのでなければ、なぜこれをしたいのかわかりません。
Linuxでは、write
システムコールを使用できます:
write(1, "hello\n", 6); // write hello\n to stdout
それを十分に入手できない場合は、システムコールを一般的に呼び出して、1つ下に移動できます:
syscall(__NR_write, 1, "hello\n", 6);
strace
について知っておく価値はあります。<=>を使用すると、特定のプログラムの実行中にどのsyscallが使用されているかを確認できます。ただし、<!> quot;一部の単純なパーサー<!> quot;では、生のシステムコールを使用する必要はほとんどありません。 cライブラリの機能をより適切に使用します。
ところで、c標準ライブラリを使用せずに上記のことをWindowsで行いたい場合は、WriteFile関数とGetStdHandle関数を参照してください。ただし、Linuxソリューションほどl33tにはなりません。