我無法理解彙編指令retq
返回的位置。Retq指令,它在哪裏返回
我明白,當我的普通代碼執行時,它會返回到棧中指定的地址。但它如何知道堆棧中的返回地址?
簡而言之,它是否使用rbp或esp來查找堆棧中的地址?
我無法理解彙編指令retq
返回的位置。Retq指令,它在哪裏返回
我明白,當我的普通代碼執行時,它會返回到棧中指定的地址。但它如何知道堆棧中的返回地址?
簡而言之,它是否使用rbp或esp來查找堆棧中的地址?
研究後彙編代碼,這是我的想法: 讓我們看一個例子:
fun:
push %rbp
mov %rsp,%rbp
...
...
pop %rbp
retq
main:
...
...
callq "address" <fun>
...
...
,我們可以看到有retq前的指令。 「pop%rbp」(有時候是離開指令,但有類似的指令)
例如: 彈出命令之前:對RSP指出爲0x0000 0000 0000 00D0
彈出命令後:0×0000 0000 0000 00D8(假設堆棧從高地址長到低地址)
之後的pop命令,現在rsp指向一個新的地址,retq把這個地址作爲返回地址。
你的意思是rbp在「並保存到基本堆棧指針(rsp)。」? –
如果你想試驗,試着用'addq $ 8,%rsp替換'retq'; jmpq -8(%rsp)'。在功能上等同(但不是性能方面)。 –