0

DLLには、個別にコンパイル、リンク、および保存される1つ以上のエクスポートされた関数が含まれていることを知っています。

私の質問はそれを作成する方法についてではありません..しかしそれはそれがどのような形で保存されるかについてです..それは0と1の形になるのでしょうか..またはアセンブリコマンドでADD、MUL、DIV、MOV 、CALL、RETURNなど。また、プロセッサに依存する理由もあります。(x86、x87、IBM 700命令セットなど)。

誰かがそれを少し簡単に説明してもらえますか..!

4

5 に答える 5

4

まず、コンピュータ内のすべてが「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ファイルとほぼ同じくらい速く実行されます。

これで問題は解決しますか?:)

于 2009-11-18T13:24:27.337 に答える
2

Windowsでは、dllはPE形式で保存されます。これは基本的に、メモリにマップする方法に関する情報を保持するセクションのコレクションです。一部のセクションにはプログラムのコード(もちろんプロセッサに依存します)が含まれ、他のセクションにはプログラムのデータが含まれ、その他のセクションにはエクスポートおよびインポートされた関数などが含まれます。

マネージコードは、実行時にランタイムによってJITされる中間言語にコンパイルされます。したがって、dllにはプロセッサに依存するコードが含まれず、関連するランタイムを使用して任意のプラットフォームでプログラムを実行できます。

于 2009-11-18T12:52:39.850 に答える
2

ネイティブDLL(.NETアセンブリではない)には通常、特定のプラットフォームでのみ実行できるマシンコードが含まれています。マシンコードは、プロセッサが命令(ADD、MOVなど)として扱う一連のバイトです。

于 2009-11-18T12:34:10.997 に答える
1

DLLによって異なります。通常、DLLには実行可能コードがEXEファイルとして含まれています。コードは特定のプラットフォームでのみ実行できるため、これらのコードDLLはプロセッサに依存します。コードは、EXEファイル(バイナリマシンコード)と同じ「フォーマット」を使用して保存されます。

ただし、DLLにはデータのみが含まれる場合があります。これらは「リソースDLL」と呼ばれ、プロセッサにまったく依存しません。これらは、アプリケーションで使用されるデータファイルのコンテナとして機能します。

多くのDLLはハイブリッドであることに注意してください。それらには、コードとリソースの両方が含まれています。たとえば、Windowsオペレーティングシステムのユーザー部分を構成するほとんどのDLLはハイブリッドです。VisualStudioまたはリソースエクスプローラーを使用してDLLを開き、それらに含まれるリソース(データセグメント)を確認したり、DependencyWalkerまたはdumpbinを使用してDLLを開いたりできます。それらに含まれる関数(コードセグメント)を参照してください。

(もちろん、この答えは実際にはWindows固有のものであり、LinuxでDLLに相当する.soファイルについてはわかりません)

于 2009-11-18T12:50:30.483 に答える
0

DLLとEXEの両方に実行可能コードが含まれています。

DLLの場合、直接実行するために必要な部分がありません。他の実行可能コードから呼び出す必要があります。1つのDLLは別のDLLを呼び出すことができますが、最終的にはすべてとEXEから呼び出す必要があります。

したがって、EXEに適用されるプロセッサとの互換性に関するルールはDLLにも適用されます。

于 2009-11-18T12:36:56.433 に答える