2

これはおそらく簡単なものですが、しばらくの間これについて混乱しています:

次のようなものがあるとします

main:
...
call some_fun
...

some_fun:
...
jmp op
...

op:
...
ret

この ret は、呼び出しが開始された場所に正しく戻りますか? そうでない場合、ret はどのように正しく返されるのでしょうか?

4

2 に答える 2

8

提供された例で、返された後に実行される次の命令がcall some_funの後の命令である場合は、戻る前にスタック フレームをクリーンアップすることを条件に、希望どおりに実行されます。

x86 アセンブリを使用していると仮定すると、次のようになります。

  1. call some_funが実行されると、戻りアドレスがスタックにプッシュされ、プログラム カウンター/命令ポインターがsome_funを指すように変更され、そこで実行が継続されます。
  2. jmp op命令はスタックを変更しません。プログラムカウンター/命令ポインターのみを変更します。
  3. ret命令は、スタックから値をポップし、それをプログラム カウンター/命令ポインターにダンプします。スタックからポップされる値は、リターン アドレスと呼ばれます。some_funopがスタックにプッシュされたものはすべて、 retを発行する前に取り出されることが非常に重要です。そうしないと、間違った返送先住所に返送されます。

お役に立てれば。

于 2013-05-03T23:35:27.613 に答える
1

それでもクラッシュする場合は、試してください

move dword[stak],esp ;一番最初に

で終わります

mov esp,[スタック]

戻る

ちょっとしたこと

GL

于 2013-05-04T01:28:37.130 に答える