2017-04-04 5 views
-1

ルーチンが呼び出されると、プロセッサはルーチンを呼び出すコードのメモリアドレスを格納して、呼び出されたルーチンが "戻る"ときに実行を続ける場所を知っていることを知っています。アドレス(リターン命令ポインタと名付けられた)がスタックに格納される。リターン命令ポインタスタック内のポインタ

  • スタック内のリターン命令ポインタが格納されます。

    私は心の中で3つの質問がありますか?

  • 関数が返されるときにRIPはどのように使用されますか?
  • これはプログラムの実行を継続させますか?
+1

Martin Liversageのこの質問に対する回答をお読みください:http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap?rq=1あなたの質問は、その質問の正確な複製ですが、その答えはあなたが求めているものの約80%をカバーしています。 –

+0

"RIP"は "Return Instruction Pointer"を意味することはどこで知りましたか? x86_64アセンブリには "rip"レジスタがありますが、 "r"は32ビットと16ビットのサブセットと区別するためにすべての64ビットレジスタ名に適用される一般的なプレフィックスです(この場合、 "eip"それぞれ "ip")。 – Quietust

+0

答えは命令セットのドキュメントにあります。関数を呼び出すときにプログラムカウンタを変更しているときと、プログラムカウンタを保存したいときの両方を考えるとき、それがそれを行うときにスタックに保存します。スタック上に何かを押し込むと、特にハードウェア/シリコンが現在のスタックポインタアドレスを使用します。 –

答えて

2

リターン命令ポインタはどこに格納されていますか?

スタックに格納されているものは、常にスタックの最上部に格納されます。それは「スタック」の定義に従っています。

関数が返されるときにRIPはどのように使用されますか?

この関数が "return"命令を実行すると、スタックの先頭の値がポップされ、命令ポインタに格納されます。

ここで、プログラムを実行し続ける必要がありますか。

中止しました。これはcall命令ではありません。それはcall命令の直後の命令です。

+0

これを明確にするために、命令ポインタ、例えば '$ eip'は、実行されるべき次の命令のアドレスを含む。このように、関数が終了するときにスタックからポップされる最後のものは '$ eip'です。これは戻りアドレスです。元の/呼び出し元関数内にあるべき次の実行される命令。 –

関連する問題