質問: アセンブリから機械コードへの移行方法(コード生成) コードをマシンコードにアセンブルする間のステップを視覚化する簡単な方法はありますか?たとえば、バイナリファイルについてメモ帳で開くと、マシンコードのテキスト形式の表現が表示されます。私はあなたが見る各バイト(記号)がそのバイナリ値に対応するascii文字であると思いますか?しかし、どのようにしてアセンブリからバイナリに移行しますか?舞台裏では何が起こっていますか?
回答: 実際には、 アセンブラ は通常を直接生成しません一部のバイナリ 実行可能 を生成しますが、一部は生成しません- オブジェクトファイル (後で リンカー に供給されます)。ただし、例外があります(一部のアセンブラを使用して、バイナリ実行可能ファイルを直接生成できます。これらは一般的ではありません)。まず、今日の多くのアセンブラが フリーソフトウェア プログラムであることに注意してください。だから、あなたのコンピューターに gnu as ( binutils の一部)と nasm のソースコードをダウンロードしてコンパイルしてください。次に、ソースコードを調べます。ちなみに、私はその目的でlinuxを使用することをお勧めします(これは非常に開発者フレンドリーで、フリーソフトウェアに優しいosです)。アセンブラによって生成されたオブジェクトファイルには、特に コードセグメント および 再配置 命令が含まれています。オペレーティングシステムによって異なりますが、十分に文書化されたファイル形式で構成されています。 linuxでは、その形式(オブジェクトファイル、共有ライブラリ、コアダンプ、実行可能ファイルに使用)は [〜#〜] elf [〜#〜] です。そのオブジェクトファイルは後で linker に入力されます(最終的に実行可能ファイルが生成されます)。再配置は [〜#〜] abi [〜#〜] で指定されます(例 x86-64 abi )。詳細については、levineの本 linkers and loaders を参照してください。このようなオブジェクトファイルのコードセグメントには、穴のあるマシンコードが含まれています(リンカーによって、再配置情報を使用して埋められます)。アセンブラによって生成された(再配置可能な)マシンコードは、明らかに 命令セットアーキテクチャ に固有です。 x86 または x86-64 (ほとんどのラップトップまたはデスクトッププロセッサで使用されます)isaは、その詳細が非常に複雑です。しかし、y86またはy86-64と呼ばれる簡略化されたサブセットが、教育目的で発明されました。それらについて slides をお読みください。この質問に対する他の回答も、その少しを説明しています。良い コンピュータアーキテクチャに関する本 を読むことをお勧めします。ほとんどのアセンブラは 2つのパス で動作しており、2番目のアセンブラは再配置を発行するか、最初のパスの出力の一部を修正しています。彼らは今、通常の 解析 テクニックを使用しています(多分 the dragon book を読んでください)。osが実行可能ファイルを起動する方法 kernel (linuxでのexecveシステムコールの動作など)は、別の(そして複雑な)問題です。通常は virtual address space をセットアップします -(process を実行する execve(2) ...を実行して)プロセスの内部状態を再初期化します( ser-mode レジスタを含む)。 ダイナミックリンカー -linuxの ld-linux.so(8) などが実行時に含まれる可能性があります。 operating system:three easy pieces などの優れた本を読んでください。 [〜#〜] osdev [〜#〜] wikiも有用な情報を提供しています。ps。あなたの質問は非常に幅広いため、それについていくつかの本を読む必要があります。私はいくつかの(非常に不完全な)参照を与えました。あなたはそれらのより多くを見つけるべきです。