2012-07-28 4 views
6

.net。メソッドの最後の命令として存在する可能性のあるOpCodeは何か。私はそれがメソッドの最後の命令のOpCodeにはどのようなものがありますか?

することができますが、それは他のオペコードすることは可能であることを知っている瞬間に

?そしてもしあれば、どのようなコード(C#を好む)がそれらを生成するでしょうか? 「最後の」私は意味、「メソッド本体で定義された最後のオペコード」と

+2

「最後」とは、メソッド本文に定義されている最後のオペコードを意味しますか、最後に実行されたオペコードを意味しますか? (方法は最下部から終了する必要はありません) –

+0

@MarcGravell "メソッド本体で定義された最後のオペコード"です。 – Simon

+0

質問に明確な、私はフレデリックの投稿に追加したコメントが疑わしいと思う –

答えて

2

throwがメソッドの最後のオペコードことができれば、チャンスはjmpも適格であることです。私たちはその終了条件端に配置されていない再帰的な方法、 を考慮すれば

また、最後のオペコード 代わり retcallまたは tail.callかもしれません。

更新:いいえ、それはありません。マルクGravellは当然彼のコメントで指摘するように、tail.callのドキュメントは言う:

スタックは 次の呼び出しによって転送された引数を除いて空でなければなりません。呼び出し命令 に続く命令は、retでなければなりません。

アップデート2:その出口点以前(おかげで再びマーク)が発生した場合brbr.s無条件分岐命令コードはまた、方法の最後の命令であってもよいです。

+1

"コール"それでも後にretが必要になる、iirc; tail.call私はそれほど確信していません(更新: "コール命令に続く命令はテールページのretでなければなりません")。私は "jmp"が有効だと思います。 –

+2

無条件分岐: 'br'と' br.s'(方法が*上がって*上がる) - 「最後」の意味に依存します(私はOPを求めます) –

関連する問題