2010-09-08 9 views
9

Spędziłem wiele godzin na problemie z debugowaniem, aby mieć bardziej doświadczonego faceta na IL (coś w stylu 00400089 mov dword ptr [ebp-8], edx) i wskazać problem. Szczerze mówiąc, to dla mnie wygląda jak hebrajski - nie mam pojęcia, co do cholery to mówi.Jak zostać profesjonalistą MSIL?

Gdzie mogę dowiedzieć się więcej na ten temat i zaimponować wszystkim wokół mnie? Moim celem jest przeczytanie rzeczy takich jak poniższe i skomentowanie: Yeh, masz kondycję wyścigu.

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

ldloca mclass 
ldc.i4 5 
+5

Haha, „Gdzie mogę dowiedzieć się więcej o tych rzeczach i zaimponować wszyscy wokół mnie.” To są dwa * zupełnie * różne pytania, przyjacielu;) Chyba że spędzasz czas wyłącznie z nerdami (jak ja), chyba ... –

Odpowiedz

4

Aby uzyskać świetny wynik w IL, zacznij od tego fantastycznego artykułu: Introduction to IL Assembly Language. Chociaż mówi "wprowadzenie", to wszystko, czego potrzebujesz, aby zacząć się czuć komfortowo.

Inna część tego, czego potrzebujesz, to praktyka i dużo tego. Użyj .NET Reflector i rozpocznij przeglądanie kodu zdemontowanego w IL. (Podpowiedź: kiedy je pobierzesz, nie musisz podawać prawdziwej wiadomości e-mail.) Zagraj też z wtyczką Reflexil w Reflectorze. Oto dobry punkt wyjścia do tego: Assembly Manipulation and C#/VB.NET Code Injection.

Nie konieczne, ale premia: Reflexil jest oprogramowaniem typu open source. Możesz pobrać źródło here.

7

To nie jest MĘSKIE, jest to langauge montażowe 80x86.

+3

Nic dziwnego, że nie wiedziałem o co chodzi. – RonT

+5

Pracując w zespole przez kilka lat, wiele lat temu, ostatnio w rutynowej procedurze kryptograficznej AES, mogę powiedzieć, że nie powinieneś próbować osłabiać swoich wysiłków, ucząc się C#, próbując pozbyć się asemblera. Jeśli twój oryginalny kod znajdował się w C#, powinieneś był być w stanie wykryć warunki wyścigu w oryginalnym kodzie. – Bill

3

Mogę podać odpowiedź, która działa w obie strony.

Z jednej strony nie ma to jak dobra znajomość języka asemblerowego, aby nauczyć cię, jak naprawdę działa komputer. MSIL jest do pewnego stopnia językiem przypominającym montaż. Z drugiej strony istnieje bardzo niewiele okazji do tego rodzaju rozwoju.

Z drugiej strony, uciekanie się do patrzenia na MSIL w celu rozwiązania problemu niekoniecznie jest najbardziej bezpośrednim lub edukacyjnym sposobem zrozumienia problemu. W ciągu pięciu lat programowania .NET nigdy nie czułem potrzeby, aby tam pojechać. Tylko jeden raz współpracownik (który pracował w Microsoft przy testowaniu kompilatorów) przeszedł tam z problemem, który próbowałem rozwiązać, i na koniec jego odpowiedź była myląca, ponieważ prawdziwy problem był oparty na projekcie CLR i ograniczeniach . Lepsza znajomość CLR i C# doprowadziłaby do lepszego zrozumienia i prawdziwego rozwiązania.

(W przypadku, gdy zastanawiasz się, problem polegał na tym, że chciałem użyć "jako" do bezpiecznego rzucania za pomocą generycznych. "Jako" nie działało, ale "jest", mój współpracownik zauważył, że "jest" i "jak" używa tego samego MSIL. Prawdziwy problem polega na tym, że "jak" działa tylko w klasach rzutowania, a bez odpowiedniego ograniczenia deklaracji ogólnej, C# nie wie, czy twój rodzajowy typ będzie klasą. W rzeczywistości, typy, których używałem z generycznymi, były typami wartości, "as" nie mogło w ogóle działać dla nich.)

Zamiast chodzić na zajęcia z MSIL, bardzo polecam książkę Jeffrey Richter CLR via C#. Nawet po latach kopania ciężko przy C#, ta książka jest wciąż pełna rewelacji - uczę się czegoś z każdej strony.

+0

Powód "as" nie działa z typami wartości, ponieważ typy wartości nie mogą mieć wartości "null", ale "as" chce zwrócić wartość "null", jeśli zmienna nie jest podanego typu. Jeśli wiesz, że twój typowy parametr 'T' jest typem wartości (tzn. Określiłeś ograniczenie' struct'), możesz użyć 'as T?' Zamiast 'as T' i będzie działać, nawet jeśli instancja jest faktycznie typu 'T', a nie' T? '. Jest to jednak problem języka C# i ma niewiele wspólnego z IL lub CLR ... – Timwi

+0

@ Timwi, dokładnie w prawo; "as" nie może zwrócić wartości zerowej na typ wartości, a to ** absolutnie ** nie ma nic wspólnego z IL. O to chodzi; uczenie się IL nie pomaga w rozwiązywaniu takich przypadków. Niezależnie od tego, czy jest to kwestia czysto językowa, czy dotyczy implementacji generycznych elementów CLR, nie mogę powiedzieć, ale zauważę, że obsługa rzutowania przez VB.NET (przez DirectCast lub TryCast) ma podobny problem. –

3

Nie mogę powiedzieć, że jestem IL „pro”, ale udało mi się nauczyć się prawie wszystko, IL, wykonując następujące czynności:

  • napisać bardzo krótki (dwa lub trzy linie) Program C#, który jesteś ciekawy jak pisać w IL.

  • Skompiluj program.

  • Otwórz skompilowany plik EXE w wersji .NET Reflector.

  • Sprawdź kod IL dla metody w Reflectorze.

  • Umieść mysz nad kodem instrukcji IL (np. "Ldloc"). Istnieje etykietka opisująca każdą instrukcję IL.