JUMP und CALL
Wie ein JUMP-und CALL-Anweisung anders? Wie bezieht es sich auf die höhere Ebene Konzepte wie die GOTO-Funktion oder eine Prozedur aufrufen? (Bin ich richtig in den Vergleich?)
Dies ist, was ich denke:
SPRINGEN oder SPRINGEN ist eine übertragung der Kontrolle an einen anderen Speicherort und die Kontrolle nicht automatisch an den Punkt zurückkehren, von wo aus es aufgerufen wird.
Auf der anderen Seite, ein ANRUF oder eine Prozedur/Funktion aufrufen, zurück zum Punkt, von wo aus es aufgerufen wird. Aufgrund dieses Unterschieds in Ihrer Natur, Sprachen in der Regel Gebrauch machen von einem stack und stack-frame geschoben wird, zu "erinnern", die Lage wieder zu kommen, für jedes Verfahren genannt. Dieses Verhalten gilt auch für rekursive Prozeduren zu. Im Fall von tail-Rekursion, es ist jedoch nicht notwendig, um "push" einen stack-frame für jeder nennen.
Ihre Antworten und Kommentare werden sehr geschätzt.
InformationsquelleAutor der Frage | 2009-02-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie meistens Recht, wenn Sie reden über CALL/JMP-in x86-assembly oder etwas ähnliches. Der wesentliche Unterschied ist:
In der Regel, NENNEN, ist nur eine Komfort-Funktion, implementiert unter Verwendung von JMP. Sie konnte etwas tun, wie
anstatt einen ANRUF.
InformationsquelleAutor der Antwort Anteru
Du bist genau richtig, was der Unterschied zwischen einem Sprung und einem Anruf.
In der Probe bei einer einzigen Funktion mit tail-Rekursion, dann ist der compiler in der Lage sein kann die Wiederverwendung der vorhandenen stack-frame. Es kann aber komplizierter werden, mit sich gegenseitig rekursive Funktionen:
Betrachten wir den Fall, wo ping() und pong() sind komplexere Funktionen, die eine unterschiedliche Anzahl von Parametern. Mark Probst Papier spricht über die tail-Rekursion-Implementierung für GCC im detail.
InformationsquelleAutor der Antwort Greg Hewgill
Ich glaube, du hast die Allgemeine Idee.
Hängt es von der Architektur, sondern in der Regel auf der hardware-Ebene:
Einer jump-Anweisung, ändern sich die Programm-Zähler weiterhin die Ausführung an einem anderen Teil des Programms.
Einem Befehl call wird, drücken Sie die aktuelle program-Position (oder den aktuellen Standort + 1) Aufrufliste und Sprung zu einem anderen Teil des Programms. Eine return-Anweisung wird dann pop die Lage abseits des call-stack und springt zurück an den ursprünglichen Speicherort (oder in Original Position + 1).
So, eine jump-Anweisung ist in der Nähe ein
GOTO
während eine call-Anweisung ist in der Nähe einer prozeduralen/Aufruf der Funktion.Auch, für der Grund, dass ein call-stack bei Funktionsaufrufen, schieben zu viele return-Adressen auf dem Aufruf-stack durch Rekursion verursachen - stack overflow.
Beim lernen von Montage, ich finde es einfacher, wenn man mit RISC Prozessoren als x86-Prozessoren, wie es dazu neigt, weniger Unterricht und einfachere Operationen.
InformationsquelleAutor der Antwort coobird
Einmal Korrektur zu deinen Gedanken: Es ist nicht nur mit Schwanz Rekursionaber in der Regel mit Schwanz Anrufedass wir nicht brauchen, den stack frame und somit einfach konnte JMP dort (vorausgesetzt, dass die Argumente korrekt eingerichtet wurden).
InformationsquelleAutor der Antwort Ingo
Gemäß Mikroprozessor, wird zunächst die Bedingung überprüft und dann führt Sprung-Operationen (geht zur anderen code) und nicht zurück.
Call-Betrieb ist wie eine Funktion callig in der
c
Sprache, und wenn die Funktion durchgeführt wird, kehrt er zurück, um seine Ausführung.InformationsquelleAutor der Antwort user2693867