2012-07-28 25 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

相關問題