4

のドキュメントにfgets()よると、関数は次の3つのパラメータを取ります。

  • char* -入力を保持する文字列
  • int-読み取る最大文字数を表す整数
  • FILE* -FILE *読み取り元のストリームへ

関数を呼び出すのに問題はありません。pushスタックに3つのパラメーターを追加し、関数を呼び出して、12ずつ増やしますESP

私の問題はパラメータ#3にあります。FILE *標準入力の場合、何を渡す必要がありますか?Cでは、を使用できますstdinが、x86アセンブリで同等のものが何であるかわかりません。


更新: LinuxでNASMを使用しています。

4

4 に答える 4

5

の問題stdinは、プラットフォーム固有のマクロであるだけでなく、アセンブリから手動でアクセスするのが難しいマクロであるということです。stdio代わりにPOSIX呼び出しを犠牲にして使用する場合stdinは、よく知られているファイル記述子#0と同じです。したがって、あなたはあなたが探していたものをほとんど手に入れる0ことができます。これはCマクロreadよりもアセンブラーに適していると確信しています。stdin

于 2010-09-11T05:43:43.537 に答える
1

アセンブリがC/C ++コードのサブルーチンである場合、ほとんどのランタイム環境は、外部参照を介してstdin変数に直接アクセスする手段を提供します。stdio.hヘッダーファイル(またはそれに含まれるもの)を確認してください。通常の容疑者は、名前が付けられた変数、または最初の3つの要素がstdin、stdout、およびstderrで__stdinあるような名前のFILE*の配列のようです。__stdio[]

Cが他の言語(アセンブリなど)のライブラリとして使用されている場合は、Cランタイムinitを自分で呼び出す必要があります。それを特定するのは難しい場合があります。方法がわからない場合は、「hello world」タイプCプログラムを作成し、デバッガーを使用してステップ実行し、セットアップ方法を確認しますstdin

もう1つのまったく異なるアプローチはfopen()、読み取るファイルのFILE*を取得するために呼び出すことです。

于 2010-09-11T05:34:40.987 に答える
0

stdinはCにのみ存在する概念です。その定義はCコンパイラとライブラリに依存し、マクロなどのために、アセンブラから呼び出すのは非常に難しい場合があります。

試すことができることの1つはstdin、レジスタサイズのグローバル変数であるかのように扱うことです。それをレジスターにロードし(Cコンパイラーが使用する名前マングリング規則を使用して)、スタックにプッシュします。これが機能しない場合は、Cライブラリのソースコードを調べて、どのように機能するかを確認する必要があります。

または、アセンブラの使用に適した低レベルのオペレーティングシステムコールを使用することもできますが、OSを指定しなかったため、具体的にするのは困難です。

于 2010-09-11T05:36:34.527 に答える
0

これはlibcを利用した純粋なアセンブリです。–ジョージ・エジソン

その場合、答えは開発システムとオペレーティングシステムに完全に依存します。Libcは、この種のことをサポートすることを目的としていません。

この種の呼び出しを行う方法を理解できたとしても、stdinは、main()が実行される前に呼び出されるルーチンを使用してlibcによって初期化される、かなり複雑なOSまたは開発システムに依存するFILEデータ構造を指します。したがって、純粋なアセンブリでは、それもすべて行う必要があります。この種のことは、単純なC言語の「Helloworld」プログラムがどのプラットフォームでもかなり適切なサイズの実行可能ファイルを作成する理由です。

stdinからいくつかの情報を読み取る単純なCプログラムを作成し、それからすべてを分解して、それが何をしているのかを正確に理解すれば、これをうまく始めることができます。しかし、これを行うのは簡単ではありません。また、学習した内容は、たとえばWindowsのVisualStudioからLinuxのgccに移植することはできません。

于 2010-09-11T05:49:29.190 に答える