2012-07-28 48 views
6

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

目前,我知道这可能是

但有可能它是任何其他操作码?如果是的话,哪些代码(更喜欢c#)会产生它们?

通过“最后的”我的意思是

+2

“last”,你是指在方法体中定义的最终操作码,还是你的意思是最后一个操作码被执行? (一种方法不需要从底部退出) – 2012-07-28 06:37:12

+0

@MarcGravell“在方法体中定义的最终操作码”。澄清在 – Simon 2012-07-28 06:50:50

+0

酷问题,然后我怀疑我添加到弗雷德里克的帖子中的评论适用 – 2012-07-28 06:54:51

回答

2

如果throw可以在方法的最后一个操作码“最终在方法体中定义的代码”,有机会,也jmp资格。

此外,如果我们考虑一个递归方法,其退出条件不位于结束, 最后的操作码 可能calltail.call代替 ret

更新:嗯,不,它不会。正如马克Gravell理所当然地在他的评论中指出的,tail.call该文件说:

堆栈必须是除了由 以下呼叫被转移的参数为空。呼叫指令 后面的指令必须是ret

更新2:无条件转移操作码,像brbr.s也可以是方法的最后一个指令,如果它的退出点出现较早的(再次感谢马克)。

+1

“调用”仍然需要一个ret后,iirc; tail.call我不确定(更新:“跟在调用指令后面的指令必须是ret”,来自尾页)。不过,我认为“jmp”是有效的。 – 2012-07-28 06:17:05

+2

另外两个替换我被杀的2个:无条件分支:'br'和'br.s'(用方法*退出*更高) - 取决于“last”的含义(我会问OP) – 2012-07-28 06:32:14

相关问题