アーキテクチャと動作モード

アーキテクチャについて
「アーキテクチャ (Architecture)」は、製品の設計や仕様を意味する言葉です。

また、「命令セットアーキテクチャ (ISA : Instruction Set Architecture)」は、CPU 命令セットの仕様という意味になります。

よく「arch」という単語を見ることがありますが、これはアーキテクチャの略です。
arch が x86_64 または amd64 というのは、Intel/AMD の 64bit アーキテクチャであることを意味しています。

コンパイラは、指定されたアーキテクチャの仕様に基づいて、バイナリコードを出力します。
Intel 系 CPU
Intel 系 CPU のアーキテクチャの歴史は、以下のようになっています。

x86Intel 8086, 80186, 80286... などの、16bit or 32bit プロセッサ、またはアーキテクチャの総称。
80x86 と総称された上、先頭の 80 も略して、x86 と呼ばれることが多いです。
80386 (i386)Intel 80386 から、32bit がサポートされました。
IA-32 は、Intel の 32bit 命令セットアーキテクチャの名称です。
IA-64Intel によって開発された、x86 と互換性のない 64bit 命令セットアーキテクチャ。
このプロセッサ上では、x86 はエミュレーションで動作するため、動作が遅くなるので、普及しなかった。
AMD64 (x86-64)AMD によって開発された、x86 との互換性がある、64bit 命令セットアーキテクチャ。
現在の名称は AMD64 ですが、当初は x86-64 という名称だったため、この名前もまだ使用されています。
Intel 6464bit アーキテクチャとしては、x86 と互換がある AMD の方が受け入れられたため、結果的に Intel も、ほぼ同じ仕様の命令セットアーキテクチャを採用した。
64bit アーキテクチャ
Intel と AMD の 64bit アーキテクチャを総称して、x64 と呼ぶ場合もあります。

アーキテクチャとして、amd64、x86-64、x64 といった名称が使われている場合、基本的にどれも同じだと思っておけば問題ありません。

Intel 64 も AMD64 も、基本的な部分はほぼ同じです。
ただし、それぞれが独自に追加した命令も一部あり、特に拡張的な機能については、各プロセッサで仕様が異なります。

一般的な命令でも、一部細かい差異はありますが、一般的なアプリケーションを作る場合、アセンブラや OS がそれをうまく処理してしてくれるので、プログラマが違いを意識する必要はほとんどありません。
マニュアル
Intel と AMD は、それぞれのアーキテクチャの仕様を、PDF で公開しています。

「intel architecture manual」「amd architecture manual」などで検索してみてください。
(最新のマニュアルについては、日本語版はありません)

AMD のマニュアルの方が、ざっくりと概要を説明しているので、最初に読むなら、AMD の方がわかりやすいです。
Intel のマニュアルの方は詳細に説明しているので、わかりにくいことがあれば、こちらを読んだほうが良いです。

ただし、両方とも、所々書き間違いが見受けられるので、出来るだけ見比べながら読んでいってください。
動作モード
Intel 64/AMD64 は、x86 との互換性があるため、従来の 16/32bit プログラムを、そのまま (再エンコードすることなく) 実行することができます。

x64 プロセッサで 16/32bit OS を動かすこともできますし、64bit OS 上で、64bit のプログラムと 16/32bit のプログラムを同時に動かすこともできます。

プロセッサがこれらのプログラムを動かすために、大きく分けて2つの動作モードがあり、さらにその下に、複数のサブモードがあります。

  • レガシーモード
    従来の 16/32bit OS で、従来の 16/32bit アプリケーションを実行するためのモード。
  • ロングモード (IA-32e モード)
    64bit OS 上で、64bit または 16/32bit アプリケーションを実行するためのモード。
    AMD では「ロングモード」、Intel では「IA-32e」モードと呼ばれます。

動作モードは、OS によって、個々のコードセグメント単位で有効にされます (つまり、プログラムごとに切り替えが可能)。
レガシーモード
以下の3つのサブモードがあります。

  • プロテクトモード
    プロテクトモード自体は、Intel 80286 でサポートされた動作モードであり、最大 4 GB のメモリ領域にアクセスできる。
  • 仮想 8086 モード
    プロテクトモード上で、8086 (16bit) のプログラムを実行する。
  • リアルモード
    8086 互換の動作をするモード。
    最大 1 MB のメモリ領域にアクセスできる。
ロングモード
以下の2つのサブモードがあります。

  • 64bit モード
    64bit OS 上で、64bit プログラムを実行する。
    x64 で拡張されたレジスタにアクセスすることができます。
  • 互換モード
    64bit OS 上で、16/32bit プログラムを実行する。

ここの解説では、以降、x64 の 64bit モードで実行させるためのプログラムを作っていくことになります。