PHP-Op-Code in einer if-Anweisung verstehen

8

Ich versuche den Op-Code für einen einfachen Code zu verstehen.

Der Code lautet:

%Vor%

Der Op-Code für den obigen Code lautet:

%Vor%

Ich versuche zu verstehen, was in Zeile 7 passiert, wie wird die Auswertung durchgeführt? Wie viele Werte gibt es im Ausdruck von if für die Auswertung ein? Es gibt 3 Werte ein, oder es gibt die 2 Werte den Wert von $ a und den Wert von $ b ein und der Ausdruck aus den Klammern von if wird danach ausgewertet?

Ich habe das Handbuch für JMPZ_EX gelesen, ich habe verstanden, was passiert in der Op-Code bis Schritt 2 danach ist ein wenig durcheinander und es ist sehr schwer für mich zu verstehen, was sind die genauen Schritte, die PHP tut.

Eine weitere Sache, die ich verstehen muss, ist, was sind alle Zweige im Op-Code, welche von allen Verzweigungen werden am Ende verwendet?

    
Starlays 23.07.2012, 08:03
quelle

2 Antworten

2

Wenn Sie nicht ASM beherrschen, denke ich, dass es am einfachsten ist, den gleichen Code zu betrachten durch Lesen seiner (fast) 1: 1-Darstellung in PHP:

%Vor%

Die Zwischendarstellung basiert auf den Negationen Ihrer tatsächlichen Klauseln, um einen Sprung über den im if -Block enthaltenen Code zu machen.

Wenn Sie wirklich verstehen wollen, wie PHP seine Eingabe in dieses Opcode-Array umwandelt, müssen Sie sich mit den Interna von PHP vertraut machen, aber nicht vor dem

Der Rest der Opcodes sind "Hintergrundrauschen", Zwischenwerte oder sogar eine Anweisung, die keinen Sinn macht 9 6 > JMP ->7 , die wahrscheinlich existiert, weil es keinen Sinn macht, den PHP-Parser auszuspucken das optimalste Opcode-Array für das ZendVM von.

    
Flavius 23.07.2012, 15:46
quelle
2
%Vor%

Geht nach den Zeilennummern #

%Vor%

JMPZ bedeutet, zum Code zu springen, wenn der Wert 0 ist. Ich bin nicht sicher, dass der spezifische Unterschied von JMPZ_EX so aussieht, als ob es die Rückgabe eines booleschen Ergebnisses erlaubt.

Also:

%Vor%

Einige Anmerkungen:

  • Es scheint, dass JMPZ_EX in diesem Fall nicht notwendig ist, aber in komplexeren if-Anweisungen nützlich wäre, in denen Sie den Wert zur Berechnung weiterer Werte verwenden müssen.
  • 6 JMP-7 ist wahrscheinlich da, um einen else Block zu ermöglichen. Wenn dies der Hauptteil des if-Blocks wäre, könnte das Beenden dieses Schritts dann über den Teil des Codes, der der else-Block war, springen.
Chris 23.07.2012 16:08
quelle

Tags und Links