-2

入力が関数にどのように与えられるかを低レベルで理解したいです。関数が実行されると、正確には何が起こりますか? たとえば、次のことを考慮してください。

int foo(int t1, int t2)
{  
  Function defintion goes here  
}

その後、コードの後半で

main()
{
  .
  .
  int a= foo(23, 24);
  . 
  .
 }

コードが正常にコンパイルされ、バイナリ ファイル、つまり高レベルのソース コードに対応する .exe ファイルが得られたとします。入力が関数に内部的に与えられるレベルと、この .exe ファイルをダブルクリックすると正確に何が起こるかを理解したいと思います。.exe をクリックすると、どのソフトウェア/ハードウェアが起動しますか? 簡単な説明を教えていただければ幸いです。

要求通り

OS:Windows CPU:Intel Core2Duo

4

2 に答える 2

1

関数呼び出しに関する限り、最初に、リテラル2324はCPUの特定のレジスタ(関数パラメータに使用されるレジスタ)にロードされます。次に、関数fooが見つかると、コードはセクションにジャンプします。

foo上記のレジスタから読み取り、にアクセスt1t2、戻り値を計算して、その値をさらに別のレジスタに格納します。次に、fooはmainで呼び出された場所にジャンプして戻ります。

次に、Mainは、fooの戻り値が格納されているレジスタから読み取り、その値を変数に入れますx

これは、関数呼び出しで何が起こるかについての高レベルの説明です。より詳細な説明は、おそらくスタックオーバーフローポストから期待するには多すぎます(しかしそうではないかもしれません)。

于 2013-03-12T14:26:11.800 に答える
0

コードを記述するプラットフォームについて、より具体的にする必要があります。ハードウェアおよびソフトウェア プラットフォームが異なれば、異なる ABI、つまり呼び出し間でパラメーターを渡す方法も異なります。

さらに、使用しているコンパイラのバージョンと言語方言に依存する場合があります。

http://en.wikipedia.org/wiki/X86_calling_conventions http://en.wikipedia.org/wiki/Application_binary_interface

答えを得るには、ハードウェア プラットフォーム、OS バージョン、使用するコンパイラ、および言語 (C/C++) で記述されているか、使用されている呼び出し規約を指定する必要があります。

相違点の例: ARM では、一部のパラメーターはレジスター経由で渡すことができ、一部はスタック経由で渡すことができます。x86 では、ほとんどのパラメーターがスタックで渡され (C++ メソッドの顕著な例外を除く)、引数の順序は言語と使用される規則によって定義され、アラインメントは標準の問題であり、M-soft の場合は商用仕様です。 .

于 2013-03-12T14:54:32.983 に答える