2016-04-01 7 views
-1

Linuxアセンブリでは、システムコールwriteを使用して文字列をデフォルト出力に書き込むことができます。しかし、このシステムコールでは文字列の長さが必要ですが、引数はすべての実行に渡って固定長ではありません。linuxアセンブリで不明な長さ引数を出力する

私は引数の長さをブラウズし、ヌルバイトを探して計算できることを知っています。私は、Linuxアセンブリで引数(または長さが不明な文字列)を簡単に出力する方法を探していますが、

Linuxアセンブリで未知の文字列長を出力する最も簡単な方法は誰にでも分かります。

答えて

1

ファイルディスクリプタに暗黙的な長さの文字列(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はシステムコール用のラッパーを持っています)。

+0

ありがとうございます。アセンブリでprintfを使用しようとしましたが、 'gcc'でコンパイルする必要があります。なぜなら、' ld'でコンパイルするとC関数を使用できないからです(実行しようとすると何らかのエラーが表示されます)。 – Sidahmed

+0

@Sidahmed:正しいことですが、 'gcc'を使ってビルドするのがlibcをリンクする最良の方法です。あなたは 'gcc -nostartfiles'で"裸の "アセンブリプログラム(' main'ではなく '_start')からlibcを引き続き使用することができます。そのように動的実行可能ファイルを取得するか、 '-static'を使うことができます。 'ld my.o -lc'を使うよりも良い選択です。ELF-interpreterフィールドが正しく設定されるようにするために余分なオプションが必要なためです。 –

+0

おかげで。 (私はこれを専門家から聞いて確認したい):gccでコンパイルすると、実行可能コードは変更されませんが、ファイルのヘッダやその他の情報)実行可能ファイルの変更?? – Sidahmed

関連する問題