2017-04-04 119 views
-1

我知道调用例程时,处理器会存储调用例程的代码的内存地址,以便它在被调用例程“返回”时知道继续执行的位置。地址(命名为返回指令指针)存储在堆栈中。返回指令堆栈中的指针

我心目中有三个问题:

  • 在堆栈在哪里存储返回指令指针?
  • 函数返回时如何使用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”只是一个适用于所有64位寄存器名称的通用前缀,以将它们与32位和16位子集(在本例中为“eip”和“ip”)。 – Quietust

+0

答案出现在指令集文档中,如果您在调用函数时想到它,那么当您更改程序计数器时,那也是您想要保存程序计数器的时间,并且如果它是一个体系结构将它保存到堆栈中,当它在堆栈中执行某些操作时,可以使用当前的堆栈指针地址,特别是当硬件/芯片执行时。 –

回答

2

堆栈中的哪个位置存储了返回指令指针?

存储在任何堆栈中的任何东西总是存储在堆栈的顶部。这是根据“堆栈”的定义。

函数返回时如何使用RIP?

当函数执行“返回”指令时,堆栈顶部的值被弹出,并存储在指令指针中。

这应该导致程序继续执行?

它离开的地方。这不是call指令。这是紧接着call指令后的指令。

+0

为了清楚起见,指令指针(例如'$ eip')包含要执行的下一条指令的地址。因此,当一个函数终止最后一个弹出堆栈的是'$ eip',这是返回地址,即。下一条要执行的指令,应该在原始/调用者函数中。 –