11

このret命令により、「esp」レジスタが 4 増加しますか?

4

3 に答える 3

25

はい、実行します

pop eip

使用できます

mov eax, [esp]
jmp eax

それを避けるために。

編集:まさにそれretです。たとえば、jmp rel_offetis は hiddenadd eip, offsetまたはjmp absolute_offsetisにすぎませんmov eip, absolute_offset。確かに、プロセッサがそれらを処理する方法には違いがありますが、プログラマーの観点からは、それがすべてです。

また、この imm8 値を : に追加する特別な形式のret:ret imm8もありますesp。たとえば、__stdcall関数はそれを使用してスタックからパラメーターを破棄します。スタックからretfポップする 16 ビット モードで使用されるバージョンは言うまでもありません。cs

EDIT2:

pop register

意味:

mov register, [esp]
add esp, 4
于 2010-11-27T15:53:46.263 に答える
2

はい。スタックには、プログラムの実行を再開するアドレスがあります(バッファオーバーフローを参照してください)。つまり、retは

pop ret_addr           ; pop deletes ret_addr from stack by adding 4 to esp
mov eip, ret_addr

これは

pop eip

ruslikが言ったように

于 2010-11-28T16:16:58.600 に答える
0

はい、プロセッサーが 32 ビット保護モードで実行されている場合。リアル モードまたは 16 ビット プロテクト モードでは、RET は POP IP を実行します。これにより、ADD ESP、2 (4 ではなく) が発生します。

于 2010-12-02T14:22:07.837 に答える