Retq指令,它返回哪里

时间:2013-08-19 10:10:40

标签: stack-overflow inline-assembly

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

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

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

2 个答案:

答案 0 :(得分:3)

学习汇编代码之后,这是我的想法: 让我们看一个样本:

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

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

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

  1. 移动当前堆栈指针(rsp)的内容指向并保存到基本堆栈指针(rsp)。
  2. 将rsp和指针移动到堆栈上的上一个地址。
  3. 例如:   在pop命令之前:rsp指向0x0000 0000 0000 00D0

    弹出命令后的

    :0x0000 0000 0000 00D8(假设堆栈从高地址变为低地址)

    在pop命令之后

    ,现在rsp指向一个新地址,retq将此地址作为返回地址。

答案 1 :(得分:0)

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

实际上是pop %tmp / jmp *%tmp,其中tmp是内部临时寄存器。

ret仅取决于RSP。

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