2013-08-19 17 views
7

retq derleme talimatının nereye döndüğünü anlayamıyorum.Retq yönergesi, nerede dönüyor

Normal kodum yürütüldüğünde, yığında belirtilen adrese döndüğünü anlıyorum. Ancak yığında bulunan iade adresinin nerede olduğunu nasıl biliyor?

Kısacası, yığındaki adresi bulmak için rbp veya esp kullanıyor mu? en numune bakalım: biz retq önce talimat yoktur görebilirsiniz

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

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

+1

Denemek isterseniz, 'retq 'yerine' addq $ 8,% rsp; jmpq -8 (% rsp). Fonksiyonel olarak eşdeğer (performans açısından değil). –

cevap

3

çalışma düzeneği kodundan sonra, burada benim düşüncedir. "Açılır% RBP"

  1. hareket mevcut yığın işaretçisi (RSP) nokta içeriği ve baz yığın işaretçisi (RSP) için kazandıracak talimatı (bazen bir izin talimatıdır ama benzer vardır).
  2. rsp ve işaretçiyi yığındaki önceki adrese taşıyın. örneğin

: açılır komutu önce: 0x0000 0000 0000 00D8 (yığın düşük adresine yüksek adresinden büyür varsayalım)

: RSP açılır komutun ardından 0x0000 0000 0000 00D0

işaret edilmiştir Pop komutundan sonra

, şimdi rsp yeni bir adrese işaret eder ve bu adresi ret adresi olarak kabul eder.

+0

Yani "rbp in" ve "base stack pointer (rsp) 'a kaydetmek" derken? –