2016-06-25 5 views
0

Ich versuche, ein einfaches Programm zu zerlegen, das eine einfache Funktion enthält. Dieses Programm wird mit gcc für ein 32-Bit-x86-Ziel kompiliert. Die Funktion wird über eine Aufrufanweisung aufgerufen. Am Ende der Funktion sehe ich eine Ret-Anweisung, die normal ist, aber es gibt auch eine Leave-Anweisung. Es gibt keine Eingabeanweisung irgendwo ist das Programm. Ich frage mich, was macht diese Funktion verlassen ....Was ist der Unterschied zwischen verlassen und ret

Antwort

1

Leave: einen Stapelbereich zu verlassen. Lassen Sie dies in umgekehrter Reihenfolge eingeben. Damit wird der Reseviert von Enter-Stack-Bereich freigegeben.

Ret: Rückkehr von Verfahren. Ret beendet die Ausführung einer Prozedur und überträgt den Steuerungsfluss an das aufrufende Programm. Ret hat optionale Wortoperanden. Dies gibt die Anzahl der Bytes an, die auf dem Stapel gelöscht werden sollen, nachdem die Rückkehradresse aus dem Stapel entfernt wurde.

+0

Danke, aber es gibt keine Eingabe-Anweisung in meiner Funktion. Aber ich sehe eine Spitze der Funktion "push ebp" und "mov% esp,% ebp". Diese 2 Zeilen könnten das Äquivalent von enter sein? – Bob5421

1

Ähnlich, aber nicht gleich. Lesen Sie zuerst Enter vs Push

eingeben: , Reserve für einen Stapelbereich. Mit "Enter" reservieren Sie einen bestimmten Speicherbereich des Stacks, der für die Parameterübergabe benötigt wird. Das Wort Operand gibt die Anzahl der Bytes an, die auf dem Stapel zugeordnet werden sollen. Der Byteoperand repräsentiert die Verschachtelung der aktuellen Prozedur. Wenn der Byteoperand 0 ist, wird EBP auf den Stapel gelegt. Anschließend wird der Wert von ESP in EBP kopiert und ESP wird um den Wortoperand dekrementiert.

Verwandte Themen