2

関数Aが関数Bを呼び出した後、Bのコードは、Aのローカル変数に影響を与えることなく、すべてのレジスタ(スタックポインタとBのパラメータを保持するレジスタを除く)を破棄できますか?したがって、関数Bが関数Aに戻った後、関数Aはすべてのローカルをスタックからポップバックしますか(関数Bの実行中にレジスタの状態が変更された可能性があるため)?

グローバル変数はどうですか?関数Bは、グローバル変数の状態に影響を与えるレジスタ操作についてまったく心配する必要がありますか?

(私がこれを尋ねる主な理由は、実行時に配列を実行可能にするためにを使用して関数Bとしてマシンコードを挿入しmprotect、次に配列ポインターを関数ポインターにキャストして呼び出すことを実験したいと思うからです。上記の質問で私は願っていますBの遊び場の範囲を把握するため。)

4

2 に答える 2

4

これはcalling convention、アーキテクチャ、オペレーティングシステム、およびコンパイラに依存します。

編集0:

あなたのためのもう一つのリンク:application binary interface。特定のハードウェア/OS/コンパイラの組み合わせにドリルダウンします。パラメータ/戻り値に使用されるレジスタ、特定のもののために予約されているレジスタ、および特定の関数がclobberするために無料であるレジスタを確認できます。

于 2012-06-11T01:08:39.737 に答える
1

他の関数の呼び出しをどのように処理するかは、関数次第です。別の関数に分岐する前にすべてのローカル変数をスタックに格納するのが通常ですが、他の関数が特定の2つのレジスタのみを使用することがわかっていて、これら2つのレジスタをどこでも使用しない場合は、格納する必要はありません。その関数に分岐する前に、スタック上のすべてのもの(もちろん、後で分岐するアドレス以外)。

これは実際には低レベルの実装設計の決定(通常はコンパイラーによって決定されます)であるため、一部の関数は現在レジスターにあるものでBを信頼しますが、他の関数は信頼しない場合があります。

于 2012-06-11T01:01:13.227 に答える