我无法理解汇编指令retq
返回的位置。
据我所知,当我的普通代码执行时,它会返回堆栈中指定的地址。但它如何知道堆栈中的返回地址位于何处?
简而言之,它是否使用rbp或esp来查找堆栈中的地址?
答案 0 :(得分:3)
学习汇编代码之后,这是我的想法: 让我们看一个样本:
fun:
push %rbp
mov %rsp,%rbp
...
...
pop %rbp
retq
main:
...
...
callq "address" <fun>
...
...
我们可以看到retq之前有一条指令。 “pop%rbp”(有时它是一个离开指令但有相似的)指令
例如: 在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作为帧指针是完全可选的软件约定,启用优化后,现代编译器甚至都不会这样做。