pop
が実際にAssemblyで何をするのか混乱しています。 pop
は値Push
edを最後にスタックに移動しますか(最後の要素MOV
edの後の値をPush
した場合は適用されません)またはスタックの最後にある値をポップするだけです(つまり、MOV
とPush
の両方に適用されます)か、スタックポインターが指す値をポップしますか?次のコードを検討してください。
Push $4
mov $5, -4(%esp)
add $4, %esp (esp pointing to an unknown value)
pop %ebp
したがって、このコードでは、ebp
にポップされる値は4、5、またはesp
が指す不明な値になりますか?
後者
POP EBP
に相当
MOV EBP, [ESP]
ADD ESP, 4 ; but without modifying flags, like LEA ESP, [ESP+4]
(Intel構文の場合-左側がターゲット、右側がソース)
プッシュは行います:
ESP := ESP-4 ; for x86; -8 for x64
MEMORY[ESP]:=<operandvalue>
POPは:
<operandtarget>:=MEMORY[ESP];
ESP:=ESP+4 ; for x86; +8 for x64
このような擬似コードで説明を書き留めると、マシン命令が何をするのかを理解するのがはるかに簡単になります。 Intelリファレンスマニュアルはそのような擬似コードでいっぱいです、そしてそれらを手に入れて、そしてあなた自身のために詳細を読むことはあなたの時間と手間をかける価値があります。
あなたの特定の質問に関して:あなたの$ 5を-4(%esp)に格納することは有効な機械命令であり、プロセッサは文句なしにそれを実行しますが、それは本当に非常に安全でないプログラミングです。プロセッサがその命令の直後にトラップまたは割り込みを取得した場合、プロセッサの状態は(通常は)「スタックの最上位」に保存され、値を上書きします。割り込みは非同期で発生するため、5ドルが失われることはめったにありません。そのため、デバッグが非常に困難なプログラムになります。
「add $ 4」は、ESPを元の場所に戻しますbefore Push命令です。したがって、ebpにポップされた値については、「不明」以外は何も言えません。 「あなたがあなたの選択肢の1つとして提案したように。