web-dev-qa-db-ja.com

プッシュとポップはアセンブリでどのように機能しますか

popが実際にAssemblyで何をするのか混乱しています。 popは値Pushedを最後にスタックに移動しますか(最後の要素MOVedの後の値をPushした場合は適用されません)またはスタックの最後にある値をポップするだけです(つまり、MOVPushの両方に適用されます)か、スタックポインターが指す値をポップしますか?次のコードを検討してください。

Push $4
mov $5, -4(%esp)
add $4, %esp (esp pointing to an unknown value)
pop %ebp

したがって、このコードでは、ebpにポップされる値は4、5、またはespが指す不明な値になりますか?

7
GamefanA

後者

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つとして提案したように。

14
Ira Baxter