.NET язык ассемблера

Я понимаю разницу между декомпилятором и дизассемблером (дизассемблер / декомпилятор .NET), т.е. дизассемблер позволяет преобразовывать машинный код в язык ассемблера (который вы можете увидеть в окне разборки в Visual Studio), а декомпилятор преобразует язык ассемблера в язык высокого уровня, например C #.

Можно ли увидеть ассемблерный код (из окна разборки), сгенерированный джиттером, в текстовом файле? Я подозреваю, что не потому, что он оптимизирован для работы точно в срок.

Кроме того, является ли MSIL языком ассемблера или языком высокого уровня в контексте моего первого вопроса? то есть в .NET, похоже, есть два языка ассемблера, то есть MSIL и язык ассемблера, сгенерированный JITTER, хотя я подозреваю, что ответ заключается в том, что JITTER генерирует машинный код, который отформатирован как язык ассемблера в окне Dissassembly.

Я потратил время на чтение других вопросов, но не нашел ответа.


person w0051977    schedule 31.08.2013    source источник
comment
Это не очень полезно, в частности, потому что в окне Disassembly есть ошибка, из-за которой адреса CALL отображаются неправильно. Если вы хотите изучить машинный код, используйте компилятор C. Он не сильно отличается от машинного кода, генерируемого джиттером.   -  person Hans Passant    schedule 31.08.2013
comment
@HansPassant, спасибо. Я буду использовать переключатель -S с компилятором CyGwin. Я хочу понять, чем управляемый код отличается от нативного кода (например, C или C ++) на более низком уровне. Я понимаю, что в управляемом коде есть сборщик мусора, но я не уверен, как это отличает код на более низком уровне (на языке ассемблера или ниже).   -  person w0051977    schedule 31.08.2013
comment
Как упоминал ХансПассант, в целом это было бы бесполезно для всех, кроме академических целей. Итак, если вы просто пытаетесь чему-то научиться, дерзайте! Если это часть экспедиции по поиску жука или чего-то в этом роде, вы, вероятно, зашли слишком далеко. Хорошей охоты!   -  person fourpastmidnight    schedule 31.08.2013


Ответы (2)


Я думаю, что здесь важно понимать определения (похоже, что вы в основном понимаете, это просто для уверенности).

Во-первых, ассемблер: это просто любой понятный человеку язык, на котором каждый оператор компилируется непосредственно в инструкцию в некотором машинном коде (который может быть, например, машинным кодом x86 или байт-кодом .Net).

Исходя из этого, дизассемблер - это программа, которая обращает эту компиляцию: она преобразует машинный код в соответствующий язык ассемблера.

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

Возможно, изображение всех опций (включая де- / компиляцию 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 :-) Окно Disassembly показывает язык ассемблера программы после того, как она была изменена, то есть язык ассемблера «реального» процессора (обычно Intel).

Используя ngen, вы можете скомпилируйте свое приложение .NET в "собственный" машинный код. Оттуда вы, вероятно, сможете использовать "стандартный" дизассемблер, чтобы посмотреть, что внутри.

person xanatos    schedule 31.08.2013
comment
У вас есть какие-нибудь подробности о дизассемблировании кода ngened? Я не уверен, что это так просто, как вы говорите. - person svick; 31.08.2013
comment
@svick Возможно, у idapro есть возможность экспортировать в текстовый файл, или, по крайней мере, вы можете выбрать, скопировать, вставить в свой блокнот ... Попробуйте developmentthefuture.net/ и stackoverflow.com/questions/4565796/ - person xanatos; 31.08.2013
comment
Я бы подумал, что вам нужно загрузить свою сборку ngen'd в отладчик / дизассемблер, а также в mscoree.dll (который является механизмом выполнения .NET Core Runtime, например JITter). Насколько я слышал, это не так сложно, как с монстром VB6 !! (но я уверен, что это все равно непросто). Также имейте в виду, что в зависимости от машины, на которой выполняется код .NET, байты, выводимые через ngen, не всегда могут быть точно такими же. .NET имеет недетерминированный MSIL - ›компиляция машинного кода. - person fourpastmidnight; 31.08.2013