2010-09-08 19 views
9

Ho passato ore su un problema di debug solo per avere un ragazzo più esperto guardare l'IL (qualcosa come 00400089 mov dword ptr [ebp-8], edx) e segnalare il problema. Onestamente, questo mi sembra ebraico - non ho idea di cosa diavolo sta dicendo.Come diventare un pro MSIL?

Dove posso saperne di più su questa roba e impressionare tutti intorno a me? Il mio obiettivo è leggere cose come le seguenti e fare un commento del tipo: Sì, hai una condizione di gara.

.maxstack 2 
.entrypoint 
.locals init (valuetype [MathLib]HangamaHouse.MathClass mclass) 

ldloca mclass 
ldc.i4 5 
+5

Haha, "Dove posso saperne di più su questa roba e impressionare tutti intorno a me." Queste sono due * completamente * diverse domande, amico mio;) A meno che non esca esclusivamente con i nerd (come me), immagino ... –

risposta

4

Per essere bravi a IL, inizia con questo fantastico articolo: Introduction to IL Assembly Language. Anche se dice "introduzione", è tutto ciò che serve per iniziare a sentirsi a proprio agio.

L'altra parte di ciò che ti serve è pratica e molto. Utilizzare .NET Reflector e iniziare a guardare il codice smontato in IL. (Suggerimento: quando vai a scaricarlo, non devi fornire una vera e-mail.) Inoltre, gioca con il plugin Reflexil in Reflector. Ecco un buon punto di partenza per questo: Assembly Manipulation and C#/VB.NET Code Injection.

Non necessario, ma un bonus: Reflexil è open source. È possibile ottenere la fonte here.

7

Questo non è MSIL, è langauge di montaggio 80x86.

+3

Non mi meraviglia che non sapessi cosa sta succedendo. – RonT

+5

Dopo aver lavorato in assemblaggio per diversi anni, molti anni fa, di recente su una routine crittografica AES, posso dirti che non dovresti tentare di diluire i tuoi sforzi imparando C# tentando di rovinarti sull'assemblatore. Se il tuo codice originale era in C# dovresti essere in grado di rilevare una condizione di competizione nel codice originale. – Bill

3

Posso darti una risposta che funziona in entrambe le direzioni.

Da un lato, non c'è niente come una buona conoscenza del linguaggio assembly per insegnare come funziona davvero un computer. MSIL è, in una certa misura, un linguaggio di assemblaggio. Dal lato negativo, ci sono pochissime opportunità di fare questo tipo di sviluppo più.

D'altra parte, il ricorso a MSIL per risolvere un problema non è necessariamente il modo più diretto o educativo per comprendere un problema. In cinque anni di programmazione .NET, non ho mai sentito il bisogno di andare lì. Solo una volta un collega (che aveva lavorato a Microsoft sui test del compilatore) è andato là con un problema che stavo cercando di risolvere, e alla fine la sua risposta era fuorviante, perché il vero problema era basato sulla progettazione e sui vincoli CLR . Una migliore conoscenza di CLR e C# avrebbe portato a una migliore comprensione e una soluzione reale.

(Nel caso ve lo stiate chiedendo, il problema era che volevo usare "come" per un casting sicuro con un generico. "Come" non ha funzionato, ma "è" fatto. Il mio collega ha notato che "is" e "as" usano lo stesso MSIL Il vero problema è che "as" funziona solo per il cast delle classi, e senza il vincolo appropriato nella dichiarazione generica, C# non sa se il tuo tipo generico sarà una classe. In effetti, i tipi che stavo usando con i generici erano di valore.

Piuttosto che andare per le competenze MSIL, consiglio vivamente il libro di Jeffrey Richter CLR via C#. Anche dopo anni di scavo duro in C#, questo libro è ancora pieno di rivelazioni - imparo qualcosa da ogni pagina.

+0

Il motivo 'as' non funziona con i tipi di valore è perché i tipi di valore non possono essere' null', ma 'as' vuole restituire' null' se la variabile non è del tipo fornito. Se sai che il tuo parametro di tipo generico 'T' è un tipo di valore (cioè hai specificato il vincolo' struct'), puoi usare 'come T?' Invece di 'come T' e funzionerà anche se l'istanza è in realtà di tipo 'T' e non' T? '. Tuttavia, questo è un problema di linguaggio puramente C# e ha poco a che fare con IL o CLR ... – Timwi

+0

@Timwi, esattamente a destra; "as" non può restituire un null su un tipo di valore, e questo ha ** assolutamente ** niente a che fare con IL. Questo è il punto; imparare IL non ti aiuta a risolvere casi come questo. Non si può dire che si tratti di problemi puramente linguistici o dell'implementazione CLR di generici, ma noterò che la gestione di casting di VB.NET (tramite DirectCast o TryCast) ha lo stesso problema. –

3

non posso dire di essere un IL “pro”, ma sono riuscito a insegnare a me stesso più o meno tutti di IL effettuando le seguenti operazioni:

  • Scrivi un tempo molto breve (due o tre linee) Programma C# che sei curioso di sapere come scrivere in IL.

  • Compila il programma.

  • Aprire l'EXE compilato in .NET Reflector.

  • guardare il codice IL per il metodo in Reflector.

  • passa il mouse sopra un codice operativo IL (ad esempio “ldloc”). Esiste un suggerimento che descrive ciascuna istruzione IL.

Problemi correlati