プログラムの場合、ローカル変数はスタックで定義および割り当てられますが、ローカル変数を定義する順序はそれを使用する順序と同じではないのではないかと思います。 たとえば、メイン関数では、前述のように、int a b cが定義されています。これは、a b cがスタックに割り当てられていることを意味します。つまり、変数aがスタックの一番下にある場合、変数が最初に使用されると、スタックからどのようにポップアウトされますか? または、ebpはすべての変数が保存されている場所を指しますか?
回答 1 件
関連記事
- 別の変数に格納されている変数を出力する方法
- エラー:UnboundLocalError:割り当て前に参照されたローカル変数 '試行'
- カミソリASPNET Core MVCのローカル変数を減らすことはできません
- 割り当て前に参照される/ Tag/HTC-Phones /ローカル変数 'tag'のUnboundLocalError:Django
- ReactNativeのコンポーネントにローカル変数を渡す
- ローカル変数をシグナルハンドラー関数に渡します
- Cポインターの問題:ローカル変数のアドレスが関数をエスケープする可能性があります
- 割り当て前に参照されるローカル変数「カーソル」
- スタックは、見つけることができるはずのローカルモジュールを見つけることができません
- UnboundLocalError:割り当て前に参照されるローカル変数 'req'
関連した質問
- mesonからmakefileコマンドを実行しますか?
- クライアントごとに1つのスレッドを持つUDPエコーサーバー
- これらの答えのうち、Ubuntu 1404 LTSのO_RDWRに相当するものはどれですか?
- カスタム/ dev /ファイルに書き込まれた文字列を取得する
- get_user内のユーザースペースの逆参照が正しいのはなぜですか?
- muslでコンパイルすると: '再配置エラー:secure_getenv:シンボルが見つかりません '
- WindowsとLinuxの間でmalloc()とfree()の動作にこの違いが生じる原因は何ですか?
- 複数のターゲットが同じ依存関係
- cのスタックを使用して文字列内のバランスの取れた括弧をチェックする
- `struct siginfosi_int`を送信するには、SI_QUEUEを使用してカーネルからリアルタイム信号を送信する必要がありますか?
基本的に関数内で、ローカル変数はスタックフレームに保存されます。スタックフレーム内では、変数のアクセス順序はランダムにすることができます。これを読むことをお勧めします:http://www.cs.uwm.edu/classes/cs315/Bacon/Lecture/HTML/ch10s07.html
次のコードを検討してください
コンパイラは次のコードを生成できます
変数
a
、b
およびc
場所rbp-4
に保存されます 、rbp-8
およびrbp-12
、したがって、各変数は4バイトを取得します(私のシステムでは)。スタックは下向きに成長し、この関数のスタックフレームの開始はrbp
の内容によって示されるため、マイナスです。 。次に、最初の
c = c + 55
そして、a = a + 10
プッシュまたはポップ操作を行わず、add DWORD PTR [rbp-12], 55
を使用してロケーションに直接アクセスするだけです およびadd DWORD PTR [rbp-4], 10
それぞれ。コンパイラは、これらの変数がスタックフレーム内のどこにあるかを認識します。push rbp
に注意してください 変数が宣言およびアクセスされる前。この操作はrbp
の現在の値を保存しました (ベースポインター、64ビット)、スタックフレーム上。次のrbp
この関数の制限を示す新しい値を取得するために更新されます。この制限内であれば、すべてのローカル変数を保存できます。pop rbp
にも注意してください 戻る前に。これにより、rbp
の古い値が復元されます 前に保存されたスタックフレームから、ret
の後 、古い状態に戻ることができます。