2012-07-28 10 views
6

In .net sind die möglichen OpCodes, die als letzte Anweisung einer Methode existieren können.Was sind die möglichen OpCodes für die letzte Anweisung einer Methode?

Im Moment weiß ich, dass es http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.ret.aspx

  • Wurf http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.throw.aspx
    • Ret sein kann, aber es ist möglich, dass es noch andere Opcodes zu sein? Und wenn ja, welcher Code (lieber C#) würde sie produzieren?

      von „Last“ Ich meine, „die letzte OpCode im Verfahren Körper definiert“

    +2

    Mit "last" meinst du den letzten Opcode, der im Methodentext definiert wurde, oder meinst du, dass der letzte Opcode ausgeführt wurde? (Eine Methode muss nicht von unten ausgehen) –

    +0

    @MarcGravell "der endgültige Opcode, der im Methodenkörper definiert ist". geklärt in der Frage – Simon

    +0

    Cool, dann vermute ich, dass der Kommentar, den ich zu Frederics Beitrag hinzugefügt habe gilt –

    Antwort

    2

    Wenn throw der letzte Opcode in einem Verfahren sein kann, stehen die Chancen, dass jmp auch qualifiziert.

    Auch wenn wir eine rekursive Methode, deren Ausgangsbedingung prüfen, ist nicht am Ende befindet, der letzte Opcode könnte sein ein call oder tail.call anstelle eines ret.

    Update: Nun, nein, wird es nicht. Als Marc GRA zu Recht in seinem Kommentar weist darauf hin, sagt die Dokumentation für tail.call:

    Der Stapel mit Ausnahme der Argumenten leer sein muss der folgende Aufruf übertragen werden. Die Anweisung, die auf die Aufrufanweisung folgt, muss eine ret sein.

    Update 2: Unconditional Zweig Opcodes wie br und br.s können auch die letzten Anweisungen eines Verfahrens sein, wenn seine Austrittsstelle früher (nochmals vielen Dank Marc) auftritt.

    +1

    "call" würde immer noch ein ret nach ihm, iirc; tail.call Ich bin mir weniger sicher (update: "Die Anweisung, die der Aufrufanweisung folgt, muss ein ret sein", von der Endseite). Ich denke aber "JMP" ist gültig. –

    +2

    Zwei weitere, um die 2 zu ersetzen, die ich getötet habe: unbedingter Zweig: 'br' und' br.s' (mit der Methode * extingu * weiter oben) - abhängig von der Bedeutung von "last" (Ich werde das OP fragen) –