方法的最后一条指令可能有哪些OpCode?

Sim*_*mon 6 .net c# il cil opcode

在.net中可以作为方法的最后一条指令存在的可能的OpCode是什么.

目前我知道它可以

但它有可能成为任何其他操作码吗?如果是这样,什么代码(更喜欢c#)会产生它们?

"最后"我指的是"方法体中定义的最终OpCode"

Fré*_*idi 3

如果throw可以是方法中的最后一个操作码,那么它很可能jmp也符合资格。

另外,如果我们考虑退出条件不位于末尾的递归方法,则最后一个操作码可能callortail.call而不是 a ret

更新:嗯,不,不会。正如 Marc Gravell 在他的评论中正确指出的那样,文档中tail.call写道:

除了通过以下调用传输的参数之外,堆栈必须为空。call 指令后面的指令必须是ret.

更新 2:无条件分支操作码如brbr.s也可能是方法的最后一条指令,如果其退出点出现较早(再次感谢 Marc)。

  • 还有两个来替换我杀死的 2 个:无条件分支: `br` 和 `br.s` (使用方法 *exiting* 更高) - 取决于“last”的含义(我会问OP) (2认同)