2013-08-19 12 views
7

アセンブリ命令retqがどこに返ってくるのか分かりません。Retq命令、返信先

通常のコードを実行すると、スタックに指定されたアドレスに戻ります。しかし、スタック内のどこに返却アドレスがあるのか​​は、どのようにして知ることができますか?

要するに、スタック上のアドレスを見つけるためにrbpまたはespを使用していますか?研究・アセンブリ・コードの後

+1

実験したい場合は、 'retq'を' addq $ 8、%rsp;に置き換えてみてください。 jmpq -8(%rsp) 'です。機能的に同等です(ただし、パフォーマンスには問題ありません)。 –

答えて

3

は、ここに私の考えは次のとおりです。 のサンプルを見てみましょう:

fun: 
push %rbp 
mov %rsp,%rbp 
... 
... 
pop %rbp 
retq 

main: 
... 
... 
callq "address" <fun> 
... 
... 

我々はretq前に指示がある見ることができます。 「ポップ%のRBP」は

  1. 移動するように、現在のスタックポインタ(RSP)点の含有量は、ベーススタックポインタ(RSP)に保存された命令(いつかは脱退命令であるが、類似あります)。
  2. rspとポインタをスタック上の前のアドレスに移動します。例えば

:popコマンドの前に :0000 0000 0000 00D8(スタックは下位アドレスに上位アドレスから成長すると仮定)

:RSPは、popコマンドの後00D0

0000 0000 0000を指摘しました。

popコマンドの後には、rspが新しいアドレスを指し、retqがこのアドレスをリターンアドレスとして使用します。

+0

"とスタックスタックポインタ(rsp)に保存"のrbpを意味しますか? –