2016-11-07 1 views
0

zurückkehrt Zum Beispiel drückt x86 die Rücksprungadresse auf dem Stapel und dann (bei Rückkehr) knallt es. Wie löst JVM dieses Problem? Danke im Voraus.Wie JVM von der Funktion

+0

JVM wird nicht zur Assembly kompiliert. –

+0

Ich weiß es. Es hat nichts gemeinsam. – Gilgamesz

+0

Wissen Sie, Java Bytecode zu lesen? [Hier] (https://en.wikipedia.org/wiki/Java_bytecode#Example) ist eine sehr, sehr grundlegende Grundierung. –

Antwort

2

Wenn Sie auf die Sprungbefehle beziehen jsr, jsr_w und ihre ret sie verhalten sich ähnlich, wie es auf x86 geschieht, Absenderadresse und Parameter werden auf dem Stapel und die Rückkehradresse geschoben wird von dort abgerufen, wenn der Rückkehr.

Aber es ist wichtig zu beachten, dass es sich hier um Miniatur-Subroutinen handelt, nicht Java-Methoden.

Aufrufe an Java-Methoden werden mit spezifischen invoke_* Bytecode-Anweisungen ausgeführt, die in der Implementierung variieren können (abhängig von der verwendeten jvm) und viel mehr handhaben müssen (z. B. virtuelle Funktionsauflösung) als für einfache Sprungbefehle erforderlich ist.

Sie werden immer noch einen Stapel verwenden und einen neuen Aufrufrahmen für jeden Methodenaufruf definieren, aber der Vorgang der Rückkehr von einer Funktion wird direkt von der invoke_* Implementierung behandelt, die Ziel-Java-Methode muss nur den Rückgabewert korrekt speichern auf seinem Stapelrahmen.