ファイルディスクリプタに暗黙的な長さの文字列(Cスタイルのヌルターミネーション)を書き込むLinuxシステムコールはありません。だから、システムコールをする前に長さを自分で調整しなければなりません。
Linuxは、多くのアーキテクチャ間で移植されるので、私は、ポータブルアセンブリ言語で別名Cを答えを表現します:それはちょうどあなたが表示されますが、(
int write_implicit_length_string(const char *str) {
size_t size = strlen(str);
return write(1, str, size); // stdout is always fd 1
}
ASMを見たい場合は、compile it with gcc strlenへの関数呼び出し。gcc -O3はx86上のstrlenのインラインコードではありません。
strlenの実装では、x86-64では、最初のゼロバイトを見つけるためにpcmpeqb/pmovmskb/test/jnzを使用するSSE2ループが最適です。明らかに、すべてのISAには独自の方法がありますが、重要なポイントは、カーネルにあなたのためにそれをさせる方法がないということです。
stdio FILE *
(例:fputs
)に文字列を出力するC標準ライブラリ関数はありますが、unixファイル記述子はありません(libcはシステムコール用のラッパーを持っています)。
ありがとうございます。アセンブリでprintfを使用しようとしましたが、 'gcc'でコンパイルする必要があります。なぜなら、' ld'でコンパイルするとC関数を使用できないからです(実行しようとすると何らかのエラーが表示されます)。 – Sidahmed
@Sidahmed:正しいことですが、 'gcc'を使ってビルドするのがlibcをリンクする最良の方法です。あなたは 'gcc -nostartfiles'で"裸の "アセンブリプログラム(' main'ではなく '_start')からlibcを引き続き使用することができます。そのように動的実行可能ファイルを取得するか、 '-static'を使うことができます。 'ld my.o -lc'を使うよりも良い選択です。ELF-interpreterフィールドが正しく設定されるようにするために余分なオプションが必要なためです。 –
おかげで。 (私はこれを専門家から聞いて確認したい):gccでコンパイルすると、実行可能コードは変更されませんが、ファイルのヘッダやその他の情報)実行可能ファイルの変更?? – Sidahmed