2012-07-28 12 views
6

In .net quali sono gli opcode possibili che possono esistere come ultima istruzione di un metodo.Quali sono i possibili OpCode per l'ultima istruzione di un metodo?

Al momento so che può essere

Ma è possibile per essere tutti gli altri codici operativi? E se sì quale codice (preferisco C#) li produrrebbe?

Con "Ultimo", "l'OpCode finale definita nel corpo del metodo" Voglio dire

+2

Per "ultimo" si intende l'opcode finale definito nel corpo del metodo o si intende l'ultimo codice operativo eseguito? (un metodo non deve uscire dal fondo) –

+0

@MarcGravell "l'ultimo codice operativo definito nel corpo del metodo". chiarito nella domanda – Simon

+0

Cool, quindi sospetto che il commento che ho aggiunto al post di Frederic si applica –

risposta

2

Se throw può essere l'ultimo codice operativo in un metodo, è probabile che jmp qualifica anche.

Inoltre, se si considera un metodo iterativo la cui condizione di uscita non si trova alla fine, l'ultimo codice operativo potrebbe essere un call o tail.call invece di un ret.

Aggiornamento: Beh, no, non lo sarà. Come Marc Gravell sottolinea giustamente nel suo commento, la documentazione per tail.call dice:

La pila deve essere vuota tranne che per gli argomenti di essere trasferiti dal il seguente invito. L'istruzione che segue le istruzioni di chiamata deve essere un ret.

Aggiornamento 2: incondizionati codici operativi di filiale come br e br.s possono anche essere le ultime istruzioni di un metodo, se il suo punto di uscita verifica precedenti (grazie ancora Marc).

+1

"call" avrebbe ancora bisogno di un ret dopo, iirc; tail.call Sono meno sicuro (aggiornamento: "L'istruzione che segue l'istruzione di chiamata deve essere un ret", dalla coda). Penso che "jmp" sia valido, comunque. –

+2

Altri due per sostituire il 2 Ho ucciso: ramo incondizionato: 'br' e' br.s' (con il metodo * che esce * più in alto) - a seconda del significato di "ultimo" (chiederò all'OP) –

Problemi correlati