我知道调用例程时,处理器会存储调用例程的代码的内存地址,以便它在被调用例程“返回”时知道继续执行的位置。地址(命名为返回指令指针)存储在堆栈中。返回指令堆栈中的指针
我心目中有三个问题:
- 在堆栈在哪里存储返回指令指针?
- 函数返回时如何使用RIP?
- 这应该导致程序继续执行?
我知道调用例程时,处理器会存储调用例程的代码的内存地址,以便它在被调用例程“返回”时知道继续执行的位置。地址(命名为返回指令指针)存储在堆栈中。返回指令堆栈中的指针
我心目中有三个问题:
堆栈中的哪个位置存储了返回指令指针?
存储在任何堆栈中的任何东西总是存储在堆栈的顶部。这是根据“堆栈”的定义。
函数返回时如何使用RIP?
当函数执行“返回”指令时,堆栈顶部的值被弹出,并存储在指令指针中。
这应该导致程序继续执行?
它离开的地方。这不是call
指令。这是紧接着call
指令后的指令。
为了清楚起见,指令指针(例如'$ eip')包含要执行的下一条指令的地址。因此,当一个函数终止最后一个弹出堆栈的是'$ eip',这是返回地址,即。下一条要执行的指令,应该在原始/调用者函数中。 –
你可能想要阅读Martin Liversage对这个问题的回答:http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap?rq=1你的问题是“这个问题的确切副本,但该答案涵盖了你问的约80%。 –
你从哪里得知“RIP”意思是“Return Instruction Pointer”? x86_64程序集确实有一个“rip”寄存器,但“r”只是一个适用于所有64位寄存器名称的通用前缀,以将它们与32位和16位子集(在本例中为“eip”和“ip”)。 – Quietust
答案出现在指令集文档中,如果您在调用函数时想到它,那么当您更改程序计数器时,那也是您想要保存程序计数器的时间,并且如果它是一个体系结构将它保存到堆栈中,当它在堆栈中执行某些操作时,可以使用当前的堆栈指针地址,特别是当硬件/芯片执行时。 –