まず、コンピュータ内のすべてが「0と1」の形式になっています。コンピューターがこれらの一部をテキスト、画像、音声、3Dモデルなどとして表示できるという事実は、それらをどのように解釈するかによって決まります。しかし、そこにある金属では、それはすべて「0と1」(ビットとも呼ばれます)です。ただし、これらは常に8つのグループにグループ化され、これらは「バイト」と呼ばれることに注意してください。すべてのビットを個別に操作するのは面倒なので、これは本当に効率のためです。実際、今日のコンピューターはもはや1バイトでさえ動作しません(というより、それらは非常にまれにしか動作しません)。ほとんどの場合、32ビットまたは64ビットのCPUを使用しているかどうかに応じて、一度に4バイトまたは8バイトで動作します(これは素人の言葉で言えば、
.DLLファイル(.EXEファイルと同様)には、CPUが実行できる命令を記述するバイトが含まれています。CPUは、これらのバイトを.DLL / .EXEから直接取得し、それ以上変更せずに実行します。そのため、これらのファイルはCPU固有です。異なるCPUアーキテクチャでは、同じバイトの組み合わせは異なることを意味するため、.DLL/.EXEは設計されたCPUでのみ正しく実行されます。他のCPUでは、これらのバイトは他の命令を意味し、実行すると、プログラムはまったく意味のないことを実行し、すぐにクラッシュする可能性があります。
あなたが言及したアセンブリコマンドも説明に値します。「アセンブラ」はCPUが理解できる言語ではありません。それは人間が理解できる言語です。マシンコード(CPUが実際に理解するバイト)を直接書き込むのは非常に難しいために作成されました。画面上でまったくぎこちないものが表示されますが(メモ帳で.EXEファイルを開いてみてください)、機能させるにはすべてのビットを正確に設定する必要があります。
したがって、アセンブリ言語は基本的に同じですが、これらの指示が人間が読めるテキストで書かれている点が異なります。CPUが理解できるすべてのマシンコードには、人間にわかりやすい名前の命令があります。アセンブリコンパイラは、これらの命令を読み取り、CPUが実行する実際の命令を表すバイトに置き換えるだけです。これは1:1の操作です。アセンブリ言語のすべてのコマンドは、単一のマシン命令に一致します(これも素人の言葉で言えば)。
ご覧のとおり、アセンブリ言語は1つもありません。すべてのCPUアーキテクチャには、それぞれ異なる命令があるため、独自のアセンブリ言語があります。
ただし、これはすべてネイティブの.DLL/.EXEファイルに適用されることに注意してください。.NETファイルは異なります。マシンコードは含まれていませんが、抽象的で存在しないCPUの命令が含まれています。これはJavaバイトコードのようなものです。.NET .DLL / .EXEが実行されると、.NETランタイムはそれを抽象命令から特定のCPUが理解できる命令に変換します。彼らはこれを非常に速くするために多くのトリックを使用するので、これらのファイルは単純な.DLL/.EXEファイルとほぼ同じくらい速く実行されます。
これで問題は解決しますか?:)