Прежде всего, все в компьютере имеет вид «0 и 1». Тот факт, что компьютер может отображать некоторые из них в виде текста, изображений, звуков, 3D-моделей и т. Д., Зависит только от того, как вы их интерпретируете. Но там, в металле, все это просто «0 и 1» (также известные как биты). Обратите внимание, что они всегда сгруппированы в группы по 8, и они называются «байтами». Это действительно ради эффективности, потому что работать с каждым битом по отдельности было бы слишком утомительно. На самом деле, современные компьютеры даже не работают с одиночными байтами (точнее, они делают это очень редко). В основном вы работаете с 4 или 8 байтами за раз, в зависимости от того, есть ли у вас 32-битный или 64-битный процессор (это с точки зрения непрофессионала, на самом деле это немного сложнее).
Что касается файла .DLL - например, файла .EXE, он содержит байты, которые описывают инструкции, которые может выполнять ЦП. Процессор берет эти байты непосредственно из .DLL / .EXE и выполняет их без каких-либо дальнейших изменений. Вот почему эти файлы зависят от процессора. В разных архитектурах ЦП одна и та же комбинация байтов означает разные вещи, поэтому .DLL / .EXE будет корректно работать только на ЦП, для которого он был разработан. На других процессорах эти байты будут означать некоторые другие инструкции, и при запуске программа, скорее всего, немедленно совершит какую-то ерунду и вылетит.
Упомянутые вами команды сборки также заслуживают объяснения. «Ассемблер» - это не тот язык, который процессор может понимать. Это язык, который человек может понять. Он был создан потому, что писать непосредственно в машинном коде (байты, которые процессор на самом деле понимает) очень сложно. То, что вы получаете, это полная чепуха на экране (попробуйте открыть какой-нибудь файл .EXE в Блокноте!), Но каждый бит должен быть точно установлен, чтобы он работал.
Таким образом, язык ассемблера - это одно и то же, за исключением того, что эти инструкции написаны в тексте, который могут читать люди. Для каждого машинного кода, который может понять процессор, есть инструкция с понятным для человека именем. Компилятор сборки просто читает эти инструкции и заменяет их байтами, которые представляют фактические инструкции для процессора, которые нужно выполнить. Это операция 1: 1. Каждая команда на языке ассемблера соответствует одной машинной инструкции (опять же, в терминах непрофессионала).
Итак, вы видите, что нет даже одного языка ассемблера. Каждая архитектура ЦП имеет свой собственный язык ассемблера, потому что у каждого из них разные инструкции.
Обратите внимание, что все это относится к собственным файлам .DLL / .EXE. Файлы .NET отличаются - они содержат не машинный код, а инструкции для абстрактного несуществующего процессора. Это как байт-коды Java. Когда запускается .NET .DLL / .EXE, среда выполнения .NET переводит его из абстрактных инструкций в инструкции, понятные конкретному ЦП. Они используют множество приемов, чтобы сделать это очень быстро, поэтому эти файлы работают почти так же быстро, как и простые файлы .DLL / .EXE.
Это проясняет ситуацию? :)