15

我无法理解汇编指令retq返回到哪里。

我知道当我的正常代码执行时,它会返回到堆栈中指定的地址。但是它怎么知道返回地址在堆栈中的哪个位置呢?

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

4

2 回答 2

5

学习完汇编代码,下面是我的想法,我们来看一个示例:

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

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

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

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

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

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

于 2013-09-05T19:04:47.847 回答
3

ret是您pop rip在 x86 上的拼写方式:堆栈弹出和指向该值的间接分支。 https://www.felixcloutier.com/x86/ret准确记录了它做什么和不做什么。

它实际上是pop %tmp/jmp *%tmp在哪里tmp是一个内部临时寄存器。

ret仅取决于 RSP。

使用 RBP 作为帧指针是一种完全可选的软件约定,现代编译器甚至在启用优化时都不会这样做。

于 2019-10-10T16:57:18.327 回答