我无法理解汇编指令retq
返回到哪里。
我知道当我的正常代码执行时,它会返回到堆栈中指定的地址。但是它怎么知道返回地址在堆栈中的哪个位置呢?
简而言之,它是使用 rbp 还是 esp 来查找堆栈上的地址?
我无法理解汇编指令retq
返回到哪里。
我知道当我的正常代码执行时,它会返回到堆栈中指定的地址。但是它怎么知道返回地址在堆栈中的哪个位置呢?
简而言之,它是使用 rbp 还是 esp 来查找堆栈上的地址?
学习完汇编代码,下面是我的想法,我们来看一个示例:
fun:
push %rbp
mov %rsp,%rbp
...
...
pop %rbp
retq
main:
...
...
callq "address" <fun>
...
...
我们可以看到之前有一个指令retq
。(pop %rbp
有时它是一个离开指令,但它们是相似的)指令将
%rsp
到基堆栈指针%rbp
。%rsp
指针移动到堆栈上的前一个地址。例如:在 pop 命令之前,%rsp
指向0x0000 0000 0000 00D0
. 在pop
它指向的命令之后0x0000 0000 0000 00D8
(假设堆栈从高地址增长到低地址)。
在pop
命令之后,现在%rsp
指向一个新地址并将retq
这个地址作为返回地址。
ret
是您pop rip
在 x86 上的拼写方式:堆栈弹出和指向该值的间接分支。 https://www.felixcloutier.com/x86/ret准确记录了它做什么和不做什么。
它实际上是pop %tmp
/jmp *%tmp
在哪里tmp
是一个内部临时寄存器。
ret
仅取决于 RSP。
使用 RBP 作为帧指针是一种完全可选的软件约定,现代编译器甚至在启用优化时都不会这样做。