2013-08-19 79 views
7

我無法理解彙編指令retq返回的位置。Retq指令,它在哪裏返回

我明白,當我的普通代碼執行時,它會返回到棧中指定的地址。但它如何知道堆棧中的返回地址?

簡而言之,它是否使用rbp或esp來查找堆棧中的地址?

+1

如果你想試驗,試着用'addq $ 8,%rsp替換'retq'; jmpq -8(%rsp)'。在功能上等同(但不是性能方面)。 –

回答

3

研究後彙編代碼,這是我的想法: 讓我們看一個例子:

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

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

,我們可以看到有retq前的指令。 「pop%rbp」(有時候是離開指令,但有類似的指令)

  1. 將當前堆棧指針(rsp)指向的內容移動並保存到基本堆棧指針(rsp)。
  2. 將rsp和指針移到堆棧上的前一個地址。

例如: 彈出命令之前:對RSP指出爲0x0000 0000 0000 00D0

彈出命令後:0×0000 0000 0000 00D8(假設堆棧從高地址長到低地址)

之後的pop命令,現在rsp指向一個新的地址,retq把這個地址作爲返回地址。

+0

你的意思是rbp在「並保存到基本堆棧指針(rsp)。」? –