Retq指令,它返回哪里

Kau*_*hah 8 stack-overflow inline-assembly

我无法理解汇编指令retq返回的位置.

据我所知,当我的普通代码执行时,它会返回到堆栈中指定的地址.但它如何知道堆栈中的返回地址位于何处?

简而言之,它是否使用rbp或esp来查找堆栈中的地址?

cpp*_*hon 5

学习汇编代码后,以下是我的想法,让我们看一个示例:

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

main:
...
...
callq  "address" <fun>
...
...
Run Code Online (Sandbox Code Playgroud)

我们可以看到之前有一条指令retq。的pop %rbp(有时是假的指令,但它们是相似的)指令将

  1. 将当前堆栈指针的内容保存%rsp到基堆栈指针%rbp
  2. %rsp指针移动到堆栈上的前一个地址。

例如:在 pop 命令之前,%rsp指向0x0000 0000 0000 00D0. 在pop它指向的命令之后0x0000 0000 0000 00D8 (假设堆栈从高地址增长到低地址)。

在之后pop的命令,现在%rsp指向一个新的地址,并retq借此地址作为返回地址。