理由はわかりませんが、関数を呼び出して引数を渡すと、スタック(プロセッサ?)で処理されることを学びました。
誰か説明してくれませんか?
それでは、変数の値、メモリのブロックなどをどのように変更するのでしょうか?
スタックは、ほとんどの場合、引数を関数に渡すために使用されます。これを使用する理由は、関数を機能させるために(引数のために)固定メモリの場所に拘束されないためです。固定メモリから引数を取ることができる関数がある場合は、メモリが空いている場合にのみ実行でき、そのインスタンスを1つだけ実行できます。Stackを使用すると、いつでもプログラムの現在のコンテキストに対する引数を保存できます。x86プロセッサには、スタックの終わりを指すレジスタと、スタックの始まりを指す他のレジスタがあります。これらは実際には、スタックを配置するメインメモリへのアドレスにすぎません。
スタックエンドレジスタを次の場所に移動し、指定されたデータ(他のレジスタからの値、あるアドレスまたは直接値)をスタックエンドレジスタが指すアドレスに格納するPUSH命令があります。もう1つの命令はPOPで、逆の場合も同じように機能します。このように、計画に固執し、スタックにプッシュしたものを追跡する場合、どのコンテキストからでも関数を機能させることができます。
レジスタを介するなど、引数を渡すためにあまり使用されないオプションがいくつかあります。これは、たとえばBIOS割り込みによって使用されます。これについてもっと知りたい場合は、「呼び出し規約」に関する記事を読むことをお勧めします。
パラメータがスタックに渡されるという保証はなく、アーキテクチャとコンパイラに依存します。
値とメモリがどのように変更されるかについては、呼び出し元に表示される変更を行う必要がある関数を呼び出す場合、通常、提供するのは実際の値ではなく、その値 (へのポインター) のアドレスです。関数が適切なメモリ位置を知っている限り、これらの変更を行うことができます。
関数があると仮定して、これから始めましょう
int foo(int value) {
int a = 10;
return a;
}
したがって、関数呼び出しが行われるたびに、OS は、この場合は関数のローカル変数と、int a
この場合に渡される関数への引数を割り当てるために、いくらかのメモリ空間を必要としますint value
。このメモリ要件は、スタックにメモリを割り当てることによって満たされます。スタックは各プロセスに割り当てられたメモリ領域に過ぎず、実際にはスタック データ構造 (LIFO) として動作します。
ここで、関数呼び出しが行われたときにすべてのものをスタックに格納するという疑問が生じます。スタックに最初にプッシュされるのは、逆の順序で関数に渡される引数です (複数の場合)。2. 次に、この関数を呼び出した関数の戻りアドレス (この関数のfoo
実行が完了すると、呼び出し元のコード内の場所に戻る必要があるため) 3. 最後に、呼び出された関数のローカル変数がスタックにプッシュされます。 .
呼び出された関数がコードの実行を完了すると、以前にスタックに格納された戻りアドレスに戻ります。したがって、関数呼び出しが完了または戻ると言います。この場合、関数には呼び出し先関数に返す戻り値があります。その後、スペースは自由に使用できるようになり、後続の関数呼び出しで上書きできます。
(ドットを接続すると、関数内のローカル変数(自動変数)のスコープが関数呼び出しの有効期間に制限されている理由を理解できます(閉じられたスコープに関連するSOの質問をしました)呼び出しがメモリを返すためこれらのロケール変数に割り当てられたスペースはなくなりました(まだそこにありますが、関数が戻るとアクセスできなくなります)。この場合、これらの自動変数の寿命は、呼び出し先関数に戻るint a
まで制限されます。foo()
補足:: あなたが SO に投稿した多くの質問を読みました。C と、基本的なハードウェアと OS の基本的な動作を学ぼうとしていて、それらの間の混乱があなたを殺していると思います。この質問への回答とは別に、直面している質問について多くの洞察を得るために読んで理解するためのいくつかの指針をお勧めします.
関数呼び出しのためにスタックスペースに飛び込みたい場合は、このリンクを試してくださいhttp://www.binarypirates.in/2011/02/17/understanding-function-stack-in-c/
お役に立てれば