2013-08-19 7 views
7

Ich kann nicht verstehen, wo die Assembler-Anweisung retq zurückkehrt.Retq Anweisung, wo gibt es zurück

Ich verstehe, dass wenn mein normaler Code ausgeführt wird, es zu der Adresse zurückkehrt, die in dem Stapel angegeben wird. Aber woher weiß es, wo im Stapel die Absenderadresse liegt?

Kurz gesagt, verwendet es rbp oder esp, um die Adresse auf dem Stapel zu finden?

+1

Wenn Sie experimentieren möchten, ersetzen Sie 'retq' durch' addq $ 8,% rsp; jmpq -8 (% rsp) '. Funktional gleichwertig (nicht leistungsmäßig). –

Antwort

3

nach dem Studium Assembler-Code, hier ist mein Gedanke: ist bei einer Probe sehen lassen:

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

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

wir es gibt eine Anweisung vor retq sehen können. die „pop% rbp“ (manchmal ist es ein Abschied Anweisung aber es gibt ähnlich) Instruktion wird

  1. Bewegung der Inhalt des aktuellen Stapelzeiger (rsp) weist auf und Basisstapelzeiger (rsp) zu speichern.
  2. Verschieben Sie den RSP und den Zeiger auf die vorherige Adresse im Stapel.

zum Beispiel: vor Pop-Befehl: 0x0000 0000 0000 00D8 (unter der Annahme des Stapel wächst von hohen Adresse zu niedrig Adresse)

: die rsp auf 0x0000 0000 0000 00D0

nach Pop-Befehl hingewiesen wurden

Nach dem pop-Befehl zeigen nun rsp auf eine neue Adresse und retq diese Adresse als Absenderadresse.

+0

Meinst du rbp in "und speichere auf Base Stack Pointer (rsp)."? –