.NET език за асемблиране

Разбирам разликата между декомпилатор и дизасемблер (A .net disassembler/decompiler), т.е. disassembler ви позволява да конвертирате машинния код в асемблер (което можете да видите в прозореца Dissassembly във Visual Studio), а декомпилаторът преобразува асемблер в език от високо ниво, напр. ° С#.

Възможно ли е да се види асемблиращият код (от прозореца за разглобяване), генериран от трептене в текстов файл? Подозирам, че не поради факта, че е оптимизиран да бъде точно навреме.

Освен това MSIL асемблерен език ли е или език от високо ниво в контекста на първия ми въпрос? т.е. в .NET изглежда има два асемблерни езика, т.е. MSIL и асемблерният език, генериран от JITTER, въпреки че подозирам, че отговорът е, че JITTER генерира машинен код, който е форматиран като асемблер в прозореца за разглобяване.

Прекарах време в четене на други въпроси тук, но не намерих отговор.


person w0051977    schedule 31.08.2013    source източник
comment
Това не е много полезно, особено защото прозорецът за разглобяване има грешка, която показва CALL адресите погрешно. Ако искате да изучавате машинен код, използвайте C компилатор. Не се различава много от машинния код, генериран от трептенето.   -  person Hans Passant    schedule 31.08.2013
comment
@HansPassant, благодаря. Ще използвам ключа -S с компилатора CyGwin. Искам да разбера как управляваният код се различава от собствения код (напр. C или C++) на по-ниско ниво. Осъзнавам, че управляваният код има събирач на отпадъци, но не съм сигурен как това прави кода различен на по-ниско ниво (език за асемблиране или по-ниско).   -  person w0051977    schedule 31.08.2013
comment
Както бе споменато от HansPassant, като цяло това би било безполезно за всички, освен за академични цели. Така че, ако просто се опитвате да научите нещо, давайте! Ако е част от експедиция за преследване на бъг или нещо подобно, вероятно сте отишли ​​твърде далеч. Приятно ловуване!   -  person fourpastmidnight    schedule 31.08.2013


Отговори (2)


Мисля, че е важно да разбирате дефинициите тук (изглежда, че повечето разбирате, това е само за да се уверите).

Първо, асемблер: това е просто всеки четим от човека език, където всеки израз се компилира директно в инструкция в някакъв машинен код (който може да бъде например x86 машинен код или .Net байт код).

Въз основа на това, disassembler е програма, която обръща тази компилация: преобразува машинния код в съответния асемблер.

А декомпилаторът преобразува машинния код на друг език.

Може би изображение на всички опции (включително де-/компилиране на C/C++ и приемане на x86 компютър) би помогнало:

компилиране и декомпилиране на графика

Сега към вашите конкретни въпроси:

Възможно ли е да се види асемблиращият код (от прозореца за разглобяване), генериран от трептене в текстов файл?

Теоретично няма причина това да не е възможно (особено като се има предвид NGEN). На практика не знам за такъв инструмент.

MSIL асемблерен език ли е или език от високо ниво в контекста на първия ми въпрос?

Бих казал, че това е асемблерен език от високо ниво. Това със сигурност е асемблерен език и също е на по-високо ниво от нормалните асемблерни езици.

person svick    schedule 31.08.2013
comment
Благодаря. +1 за диаграмата. - person w0051977; 31.08.2013
comment
Да, мисля, че погрешното наименование тук е асемблерният език. За да бъдем по-точни, трябва да кажем машинен код, както показвате на диаграмата си. Това разсейва цялото объркване, защото очевидно MSIL не е физически машинен код (счита се за виртуален машинен код, следователно неща като Java JVM или .NET mscoree.dll, които са виртуални машини за JIT компилиране и изпълнение на генерирания байт код) дори въпреки че (вероятно) може да се счита за асемблер. Добър отговор. - person fourpastmidnight; 31.08.2013
comment
@fourpastmidnight Е, това не е физически машинен код в момента, но това може да се промени в бъдеще. Например има процесори, които могат да изпълняват байткод на Java и същото може да се направи за .Net байткод. - person svick; 31.08.2013
comment
@svick: А, това е наистина интересно. Благодаря за тази информация. Но за настоящата дискусия, предполагам, че това, което казах, е доста точно. Отново благодаря за линковете!! - person fourpastmidnight; 01.09.2013

IL/MSIL е асемблер, насочен към .NET виртуалната машина :-) Прозорецът за разглобяване показва асемблерния език на програмата, след като е прекъснат, така че асемблерният език на "истинския" процесор (обикновено Intel).

С помощта на ngen можете да компилирайте вашето .NET приложение към „родния“ машинен код. От там вероятно можете да използвате "стандартен" разглобител, за да гледате вътре в него.

person xanatos    schedule 31.08.2013
comment
Имате ли някакви подробности относно разглобяването на ngened код? Не съм сигурен, че е толкова просто, колкото звучи. - person svick; 31.08.2013
comment
@svick Вероятно idapro има опция за експортиране в txt файл или поне можете да изберете, копирате, поставите в бележника си... Опитайте developingthefuture.net/ и stackoverflow.com/questions/4565796/ - person xanatos; 31.08.2013
comment
Мисля, че ще трябва да заредите вашия ngen'd сборник в дебъгера/дизасемблера, както и mscoree.dll (което е .NET Core Runtime Execution Engine, напр. JITter). Доколкото съм чувал, това не е толкова трудно, колкото беше чудовището VB6!! (но съм сигурен, че все още не е лесно). Също така имайте предвид, че в зависимост от машината, на която се изпълнява .NET кодът, байтовете, изведени чрез ngen, може да не винаги са същите. .NET има недетерминиран MSIL -› компилиране на машинен код. - person fourpastmidnight; 31.08.2013