X86アセンブラ/16、32、64ビット
x86アセンブリ言語は、16ビット、32ビット、64ビットのそれぞれのアーキテクチャにおいて、多くの違いが存在します。以下では、ビット幅の異なるアーキテクチャ間の基本的な違いについて説明します。
歴史
編集X86アーキテクチャは、1978年にIntel 8086プロセッサのリリースとともに導入されました。その後、X86アーキテクチャは多くの変更を経験しました。たとえば、1982年にはIntel 80286プロセッサでプロテクトモードが導入され、1985年にはIntel 80386プロセッサで32ビットアーキテクチャが導入され、そして2000年にはAMD64アーキテクチャに拡張され64ビットアーキテクチャになりました。
レジスタセットの変遷
編集x86アーキテクチャの命令セットやレジスタの変遷について解説します。この変遷は、各世代のCPUの進化とともに、新しい機能や命令、レジスタの拡張が行われてきました。
8086/8088(1978年)
編集8086は、x86アーキテクチャの初期のプロセッサで、16ビットCPUとして登場しました。以下のような基本的なアーキテクチャレジスタを備えていました:
- 汎用レジスタ(General Purpose Registers):16ビット長のレジスタが8つ。
- AX, BX, CX, DX:演算やデータ転送に使用される汎用レジスタ。汎用レジスタと言いつつ80系と同じくレジスタごとにキャラクタ付があります。
- AX:多くの演算命令で暗黙的に使われます。例えば、
MUL
(乗算)やDIV
(除算)命令では、乗算や除算の結果がAXレジスタに格納されます。また、IN
やOUT
命令でもAXが使用されることが多いです。 - BX:間接アドレッシングで使用されることが多く、メモリアドレスのベースとして役割を果たします。
- CX:ループカウンタとして多用されます。
LOOP
命令はCXを自動的に減少させ、条件を満たすまでループを続けます。 - DX:入出力命令や除算命令で暗黙的に使用されます。例えば、除算(
DIV
命令)で64ビットの被除数を使う場合、DXに上位32ビットが、AXに下位32ビットが格納されます。また、IN
やOUT
命令でポート番号を指定する際もDXが使われます。
- AX:多くの演算命令で暗黙的に使われます。例えば、
- SP(スタックポインタ)、BP(ベースポインタ):スタック操作やメモリアクセスに使用。
- SI(ソースインデックス)、DI(ディスティネーションインデックス):主にストリング操作に使用。
- AX, BX, CX, DX:演算やデータ転送に使用される汎用レジスタ。汎用レジスタと言いつつ80系と同じくレジスタごとにキャラクタ付があります。
- セグメントレジスタ:CS, DS, SS, ES(セグメントメモリの管理に使用)。
- フラグレジスタ:演算結果に応じてフラグ(CF, ZF, SFなど)を保持。
- IP(命令ポインタ):現在実行中の命令のオフセットを示す。
80286(1982年)
編集80286は16ビットアーキテクチャのままでしたが、プロテクトモードを導入し、セグメントメモリモデルが拡張されました。レジスタ自体には大きな変更はありませんが、メモリアクセス範囲が1MBから16MBに拡大されました。これにより、OSやアプリケーションでより高度なメモリ管理が可能になりました。
80386(1985年)
編集80386は、x86アーキテクチャにとって大きな進化を遂げ、初の32ビットプロセッサとなりました。以下の新しいレジスタや拡張が加わりました:
- 32ビット汎用レジスタ:
- AX, BX, CX, DXなどの16ビットレジスタがそれぞれEAX, EBX, ECX, EDXなどとして32ビット化。
- インデックスレジスタやポインタも32ビット化され、ESI, EDI, EBP, ESPとして利用。
- セグメントレジスタ:CS, DS, SS, ESに加え、新たにFS, GSが追加され、プログラムの柔軟なメモリアクセスが可能に。
- フラグレジスタ:32ビットのEFLAGSレジスタ。
- 命令ポインタ:32ビットのEIPレジスタ。
- プロテクトモードと仮想86モード:メモリ保護機能の強化、ページング機能の追加による仮想メモリのサポート。
80486(1989年)
編集80486では、レジスタの基本構造は80386と同じですが、以下の点で進化しました:
- 命令パイプラインの導入:同時に複数の命令を実行できるようになり、パフォーマンスが大幅に向上。
- 内蔵FPU(浮動小数点演算ユニット):80486ではFPUがプロセッサに統合され、浮動小数点演算の性能が向上。
Pentium(1993年)
編集Pentiumアーキテクチャでは、レジスタ自体の拡張は行われませんでしたが、以下の技術が追加されました:
- スーパースケーラ処理:複数の命令を並列に処理できるデュアルパイプライン構造により、より高い性能を実現。
- 64ビットのデータバス:より効率的なメモリ操作が可能に。
Pentium Pro(1995年)
編集Pentium Proでは、アーキテクチャがP6に進化し、内部的な命令セットの処理が改善されましたが、アーキテクチャレジスタ自体に大きな変更はありませんでした。
- アウトオブオーダー実行:命令の順序に依存しない実行が可能になり、処理速度が向上。
MMX(1997年)
編集Pentium MMXプロセッサは、マルチメディア命令セット(MMX命令)が追加され、特定のマルチメディア処理(特にグラフィックス、オーディオ、ビデオ処理)が高速化されました。
- MMXレジスタ:新たに8つの64ビットMMXレジスタ(MM0〜MM7)が導入されましたが、これらは浮動小数点レジスタ(FPU)の一部を再利用しているため、MMX命令とFPU命令を同時に使用することはできませんでした。
Pentium 4(2000年)
編集Pentium 4のNetBurstアーキテクチャでは、MMXに加えて、SSE(Streaming SIMD Extensions)命令セットが導入されました:
- SSEレジスタ:新たに128ビットのXMMレジスタが8つ導入されました(XMM0〜XMM7)。これにより、より効率的な並列演算が可能になり、浮動小数点処理が高速化されました。
x86-64(2003年)
編集AMDが開発したx86-64アーキテクチャにより、x86プロセッサが64ビット化されました。Intelも後にこれを採用しました(Intel 64)。
- 64ビット汎用レジスタ:32ビットレジスタが64ビットに拡張され、RAX, RBX, RCX, RDXなどとなりました。
- 追加汎用レジスタ:新たに8つの汎用レジスタ(R8〜R15)が追加され、レジスタの利用効率が向上しました。
- 64ビットアドレッシング:64ビットアドレス空間が利用可能になり、より大規模なメモリ空間へのアクセスが可能に。
SSE2, SSE3, SSSE3, SSE4(2000年代)
編集SSE命令セットがさらに拡張され、SSE2、SSE3、SSSE3、SSE4といったバージョンが登場しました。これに伴い、XMMレジスタが16個に拡張され(XMM0〜XMM15)、128ビットSIMD(Single Instruction, Multiple Data)演算がより柔軟に実行できるようになりました。
AVX(2011年)
編集Sandy BridgeアーキテクチャからAVX(Advanced Vector Extensions)命令セットが導入され、さらに強力なベクトル演算が可能になりました。
- AVXレジスタ(YMMレジスタ):XMMレジスタが拡張され、256ビット幅のYMMレジスタが新たに16個(YMM0〜YMM15)導入されました。これにより、1命令でより多くのデータを処理できるようになり、科学計算やマルチメディア処理での性能が向上しました。
AVX2(2013年)
編集Haswellアーキテクチャで導入されたAVX2は、256ビット幅のベクトルレジスタで整数演算をサポートする大きな拡張です。
- 整数演算の強化:AVX2では、整数演算が256ビット幅のYMMレジスタ上でサポートされるようになり、整数データを一度に大規模に処理できるため、画像処理やデータ解析の性能が向上しました。
- FMA命令の導入:Fused Multiply-Add(掛け算と加算を1命令で行う)命令により、計算精度の向上と効率的な数値演算が可能になりました。
- メモリ操作の最適化:
GATHER
命令による非連続メモリアクセスがサポートされ、複雑なデータ構造の処理が効率化されました。
AVX-512(2017年)
編集Skylake-Xアーキテクチャから導入されたAVX-512は、512ビット幅のベクトル演算をサポートし、さらに大規模なデータ並列処理が可能になりました。
- AVX-512レジスタ(ZMMレジスタ):新たに512ビット幅のZMMレジスタが導入され、これにより、大規模な科学計算やディープラーニングといったデータ集約型の処理において、非常に高い性能を発揮します。
AVX10(2023年)
編集- 256ビットおよび512ビットのZMM/YMMレジスタ : AVX-512の後継として、より効率的なベクトル演算を提供し、256ビットと512ビットのベクトルサイズに統一。さまざまな命令セットのオプションを簡素化し、拡張されたSIMD演算と効率的な消費電力制御を実現。
プロセッサモードの変遷
編集x86アーキテクチャのプロセッサモードの変遷は、各世代のプロセッサの設計変更により、さまざまな動作モードが導入されてきました。以下は、その主要なプロセッサモードの変遷です。
リアルモード(Real Mode)
編集- 8086/8088(1978年)
- 最初のx86プロセッサで、1MBのメモリ空間をアドレス可能。
- セグメント:オフセットアドレッシングを使用。
- メモリ保護や仮想メモリのサポートなし。
プロテクトモード(Protected Mode)
編集- 80286(1982年)
- 24ビットアドレッシングで16MBのメモリ空間をアドレス可能。
- メモリ保護、仮想メモリ、マルチタスキングのサポート。
- プロテクトモードに移行するとリアルモードに戻るには再起動が必要(プロセッサのリセットが必要)。
- 80386(1985年)
- 32ビットアドレッシングで4GBのメモリ空間をアドレス可能。
- 32ビットレジスタと命令セットのサポート。
- セグメントベースとページベースの仮想メモリ管理を提供。
仮想8086モード(Virtual 8086 Mode)
編集- 80386(1985年)
- プロテクトモード内でリアルモードの環境をエミュレートするモード。
- リアルモードアプリケーションをプロテクトモード環境で実行可能。
- プロテクトモードの保護機能を維持しつつ、リアルモードプログラムの実行をサポート。
システムマネジメントモード(System Management Mode, SMM)
編集- Intel 386SL(1990年)
- システム管理と省電力管理のための特殊なモード。
- 通常のアプリケーションやOSからはアクセスできない、特権的な操作を実行するモード。
64ビットモード(Long Mode)
編集- AMD64(x86-64, 2003年)
- AMDが導入し、IntelもIntel 64(EM64T)として対応。
- 64ビットアドレッシングで、理論的には16エクサバイトのメモリ空間をアドレス可能(実際には制限あり)。
- 64ビットレジスタと命令セットのサポート。
- レガシーモード(リアルモードとプロテクトモード)との互換性を保持。
その他のモード
編集- リアルアドレスモード(Real Address Mode)
- プロテクトモードの一部として、実際の物理アドレスを使用するモード。リアルモードアドレッシングに似た挙動を持つ。
- 互換モード(Compatibility Mode)
- 64ビットモード内で32ビットおよび16ビットアプリケーションを実行するためのモード。
これらのモードの進化により、x86プロセッサは益々複雑で高度な機能を持つようになり、現代のコンピューティングニーズに対応しています。
命令セットの変遷
編集x86アーキテクチャの命令セットは、初期の8086プロセッサから最新のx86-64プロセッサに至るまで、多くの拡張が行われてきました。以下に、主要な命令セットの変遷をまとめます。
- 8086/8088(1978年)
- ベースアーキテクチャ
- 16ビットプロセッサ
- 1MBのメモリ空間をアドレス可能
- 基本的な算術、論理、制御命令を含む
- 80186/80188(1982年)
- 拡張
- 8086の命令セットに新しい命令を追加(NEC の V30 はこの186命令互換)
- 組み込みシステム向けに設計されたが、広く普及せず
- 80286(1982年)
- プロテクトモードの導入
- メモリ保護とマルチタスキングをサポート
- 新しいセグメントベースのメモリ管理命令
- 80386(1985年)
- 32ビット拡張
- 32ビットレジスタと32ビット命令セットの導入
- ページングをサポートする仮想メモリ管理
- 新しい命令(BSWAP、CMPXCHG、XADDなど)
- 80486(1989年)
- パフォーマンスの向上
- 内蔵FPU(浮動小数点ユニット)
- パイプライン化による命令実行の高速化
- 新しい命令(CPUID、INVD、WBINVDなど)
- Pentium(1993年)
- スーパースカラ・アーキテクチャ
- 複数の命令を同時に実行可能
- 新しい命令(CMPXCHG8B、RDTSC、RDMSR、WRMSRなど)
- MMX(1997年)
- マルチメディア拡張
- 64ビットのMMXレジスタを導入
- マルチメディア処理向けのSIMD(Single Instruction, Multiple Data)命令
- SSE(1999年)
- ストリーミングSIMD拡張
- 128ビットのXMMレジスタを導入
- 浮動小数点演算向けのSIMD命令
- SSE2(2001年)、SSE3(2004年)、SSSE3(2006年)、SSE4(2006年)と続く
- 64ビット拡張(x86-64, 2003年)
- AMD64による64ビット拡張
- 64ビットレジスタと64ビットアドレッシングのサポート
- 互換モードで32ビットおよび16ビットアプリケーションをサポート
- Intelは後にIntel 64(EM64T)として採用
- AVX(2011年)
- 拡張ベクトル拡張
- 256ビットのYMMレジスタを導入
- 浮動小数点と整数演算向けのSIMD命令
- AVX2(2013年)、AVX-512(2016年)と続く
- その他の拡張
- FMA(Fused Multiply-Add, 2013年)
- FMA3およびFMA4命令セット
- TSX(Transactional Synchronization Extensions, 2013年)
- ハードウェアサポートによるトランザクショナルメモリ
- AES-NI(Advanced Encryption Standard New Instructions, 2010年)
- ハードウェアサポートによるAES暗号化
- SHA(Secure Hash Algorithm, 2013年)
- ハードウェアサポートによるSHA-1およびSHA-256の計算
x86アーキテクチャは、多くの新しい命令セットと拡張を通じて進化し、現代の複雑で高性能なコンピューティング要求に応えるために設計されています。
仮想記憶サポートの変遷
編集x86アーキテクチャの仮想記憶サポートの変遷は、プロセッサの進化とともに進化し、より高度なメモリ管理機能を提供するようになってきました。以下に、主要な変遷をまとめます。
- 80286(1982年)
- プロテクトモード
- 初めて仮想記憶とメモリ保護機能をサポート。
- セグメントベースのメモリ管理。
- 各セグメントに対してベースアドレス、リミット、およびアクセス権を設定可能。
- 仮想メモリ空間のサイズは16MB(24ビットアドレッシング)。
- 80386(1985年)
- 32ビットアドレッシングとページング
- ページングによる仮想メモリ管理の導入。
- ページサイズは4KB。
- 32ビットの仮想アドレス空間(4GB)。
- 2レベルページテーブル(ディレクトリとテーブル)を使用。
- 各ページエントリに対してアクセス権と物理アドレスを設定可能。
- 80486(1989年)
- ページングの最適化
- ページングとメモリ管理機能のパフォーマンス向上。
- TLB(Translation Lookaside Buffer)の導入によるアドレス変換の高速化。
- Pentium(1993年)
- 追加のメモリ管理機能
- 2MBおよび4MBのページサイズサポート(拡張ページテーブル)。
- PAE(Physical Address Extension)のサポート(Pentium Pro以降)。
- PAEにより36ビットの物理アドレス空間をサポート(64GBの物理メモリ)。
- x86-64(AMD64, 2003年)
- 64ビットアドレッシングと拡張ページング
- 64ビットの仮想アドレス空間(理論的には16エクサバイト、実装上は通常48ビットから57ビット)。
- 4レベルページテーブル(PML4, PDP, PD, PT)。
- 4KB、2MB、1GBのページサイズをサポート。
- NX(No-eXecute)ビットのサポートにより、データページの実行を防止。
- 追加の仮想メモリ管理機能
- Superpaging
- 大きなページサイズのサポート(2MB、1GBなど)によるTLBミスの削減。
- HugeTLB
- 大きなページを効率的に管理するための機能。
- 新しいメモリ管理機能(近年)
- EPT(Extended Page Tables, Intel VT-x)
- ハードウェア仮想化サポートによるゲストOSの仮想メモリ管理。
- NPT(Nested Page Tables, AMD-V)
- EPTに類似したAMDのハードウェア仮想化サポート。
- PCID(Process-Context Identifiers, 2010年以降)
- コンテキストスイッチ時のTLBフラッシュを回避し、パフォーマンスを向上。
- 5-level paging(2017年)
- 5レベルページングによる最大57ビットの仮想アドレス空間サポート。
これらの仮想記憶サポートの進化により、x86アーキテクチャは高度なメモリ管理機能を提供し、現代の複雑なアプリケーションとオペレーティングシステムの要求に応えています。
仮想マシンサポートの変遷
編集x86アーキテクチャの仮想マシンサポートは、初期のソフトウェアベースの仮想化から始まり、ハードウェア支援による仮想化技術の導入によって進化してきました。以下に、主要な変遷をまとめます。
- ソフトウェアベースの仮想化
- 初期の仮想化技術
- ソフトウェアベースの仮想化は、ホストOS上で動作するハイパーバイザーがゲストOSの仮想マシンを管理。
- 二重のメモリ管理(ゲストOSとホストOS)によるオーバーヘッドが発生。
- バイナリトランスレーションやパラバーチャライゼーションを使用して、仮想化のパフォーマンスを改善。
- Intel VT-x(Intel Virtualization Technology, 2005年)
- ハードウェア支援仮想化
- 仮想マシンのパフォーマンスを向上させるために、プロセッサに仮想化支援機能を追加。
- VMX(Virtual Machine Extensions)による新しい命令セット(VMXON、VMXOFF、VMREAD、VMWRITEなど)。
- VMCS(Virtual Machine Control Structure)によるゲストOSの状態管理。
- ホストOSとゲストOSのコンテキストスイッチをハードウェアで効率的に処理。
- AMD-V(AMD Virtualization, 2006年)
- AMDのハードウェア支援仮想化
- AMD64アーキテクチャに仮想化支援機能を追加。
- SVM(Secure Virtual Machine)による仮想化命令セット(VMCALL、VMLOAD、VMSAVEなど)。
- ハードウェア支援のコンテキストスイッチとメモリ管理。
- Intel VT-d(Intel Virtualization Technology for Directed I/O, 2008年)
- I/O仮想化
- IOMMU(Input-Output Memory Management Unit)による直接I/O仮想化のサポート。
- デバイスを仮想マシンに直接割り当てることが可能。
- デバイスアクセスのセキュリティと隔離を強化。
- AMD-Vi(AMD Virtualization for I/O, 2010年)
- AMDのI/O仮想化
- IOMMUによるデバイスの仮想マシンへの直接割り当て。
- セキュアで効率的なI/O仮想化を実現。
- Nested Virtualization
- ネステッド仮想化
- 一部の仮想化技術は、仮想マシン内でさらに仮想マシンを実行可能。
- Hyper-V、KVMなどのハイパーバイザーがこの機能をサポート。
- Intel VT-x with EPT(Extended Page Tables, 2008年)
- 拡張ページテーブル(EPT)
- ハードウェア支援の二重ページングをサポートし、仮想マシンのメモリ管理を効率化。
- パフォーマンスの向上とオーバーヘッドの削減。
- AMD RVI(Rapid Virtualization Indexing, 2008年)
- 迅速な仮想化インデックス
- Nested Page Tables(NPT)による効率的な二重ページング。
- 仮想マシンのメモリ管理のパフォーマンスを改善。
- セキュア仮想化の進化
- Intel SGX(Software Guard Extensions, 2015年)
- セキュアなエンクレーブを作成し、仮想マシン内の機密データを保護。
- AMD SEV(Secure Encrypted Virtualization, 2017年)
- 仮想マシンメモリの暗号化によるセキュリティ強化。
- ゲストOSとホストOSのメモリ領域を隔離。
- コンテナベースの仮想化
- 軽量仮想化
- コンテナ技術(Docker、Kubernetesなど)による効率的なアプリケーション隔離。
- ホストOSのカーネルを共有し、リソースオーバーヘッドを最小化。
x86アーキテクチャの仮想マシンサポートは、ソフトウェアベースの仮想化から始まり、ハードウェア支援仮想化技術の導入と進化によって、効率性とパフォーマンスが大幅に向上してきました。これにより、仮想化は現代のITインフラストラクチャにおいて不可欠な技術となっています。
同時マルチスレッディングの変遷
編集x86アーキテクチャにおけるSMT(Simultaneous Multithreading、同時マルチスレッディング)の変遷は、プロセッサの効率とパフォーマンスを向上させるための重要な技術進化の一環として発展してきました。以下に、x86アーキテクチャにおけるSMTの主要な進化をまとめます。
- 初期のマルチスレッディング技術
- コンテキストスイッチング
- 1つのプロセッサコアが複数のスレッドを実行するためにコンテキストスイッチングを使用。
- スレッド間の切り替えによるオーバーヘッドが発生。
- Intel Hyper-Threading Technology (HTT, 2002年)
- Pentium 4(NetBurstアーキテクチャ)
- 導入
- Intelが初めてハードウェアベースのSMTを導入。
- 特徴
- 単一の物理コアが2つの論理プロセッサとして動作し、同時に2つのスレッドを実行可能。
- 効果
- パイプラインの効率向上とスレッドレベルの並列性の向上。
- Intel Coreアーキテクチャ以降のHyper-Threading
- Core i7(Nehalem, 2008年)
- 改良
- Hyper-Threading技術が復活し、パフォーマンスと効率が向上。
- スレッド数
- 各コアが2つの論理プロセッサとして動作し、より多くのスレッドを同時に処理可能。
- Sandy Bridge(2011年)
- 最適化
- Hyper-Threadingの最適化により、パフォーマンスとスレッド効率がさらに向上。
- Haswell(2013年)
- 強化
- Hyper-Threadingによる並列処理性能の強化。
- AMDのSMT技術
- Bulldozerアーキテクチャ(2011年)
- CMT(Clustered Multithreading)
- 2つの整数コアが1つの浮動小数点ユニットを共有する形でのスレッド処理。
- 効果
- 真のSMTと比較してパフォーマンスの向上は限定的。
- Zenアーキテクチャ(Ryzen, 2017年)
- SMTの採用
- IntelのHyper-Threadingと類似のSMT技術を導入。
- 特徴
- 各コアが2つの論理プロセッサとして動作し、並列処理性能が向上。
- 競争力
- Intelと対抗できる高いマルチスレッド性能を実現。
- 近年のSMT技術の進化
- Intel Ice Lake(2019年)
- 改良
- 最新のHyper-Threading技術を採用し、スレッド効率がさらに向上。
- Intel Tiger Lake(2020年)
- 最適化
- Hyper-Threadingの最適化と新しいマイクロアーキテクチャによる性能向上。
- AMD Zen 2およびZen 3(2019年および2020年)
- 強化
- SMTによる並列処理性能のさらなる向上。
- 効果
- 高いスレッド効率と全体的なパフォーマンス向上。
x86アーキテクチャにおけるSMT技術は、プロセッサの並列処理性能を向上させるために重要な役割を果たしています。IntelのHyper-Threading Technologyは、初期のPentium 4から始まり、Coreアーキテクチャ以降のプロセッサで最適化され続けています。一方、AMDはZenアーキテクチャ以降で本格的なSMT技術を導入し、Intelに対抗できる高い並列処理性能を実現しています。これにより、現代のx86プロセッサは、マルチスレッド環境でのパフォーマンスを大幅に向上させています。
マイクロアーキテクチャの変遷
編集x86のマイクロアーキテクチャの変遷は、プロセッサのパフォーマンス向上や新機能の追加を目的として進化してきました。以下に、主要なマイクロアーキテクチャの変遷をまとめます。
- Intel 8086/8088 (1978年)
- 特徴
- 初のx86アーキテクチャ。16ビットアドレッシング、20ビットアドレスバス(1MBのメモリ空間)。
- 8088
- 8ビット外部バスを持つ8086の廉価版。
- Intel 80286 (1982年)
- 特徴
- プロテクトモードとリアルモードのサポート。24ビットアドレッシング(16MBのメモリ空間)。
- 改良
- パフォーマンスの向上、メモリ保護機能の追加。
- Intel 80386 (1985年)
- 特徴
- 32ビットアーキテクチャ。32ビットアドレッシング(4GBのメモリ空間)。
- ページング
- 仮想メモリのサポート。
- Intel 80486 (1989年)
- 特徴
- 内蔵浮動小数点演算ユニット(FPU)。キャッシュメモリの導入。
- パイプライン化
- スーパーパイプラインの導入。
- Intel Pentium (P5, 1993年)
- 特徴
- スーパースカラ・アーキテクチャ(複数の命令を同時実行)。
- キャッシュ
- L1キャッシュの増加。
- Intel Pentium Pro (P6, 1995年)
- 特徴
- 動的実行(アウトオブオーダー実行、投機的実行)。
- キャッシュ
- L2キャッシュの導入。
- Intel Pentium II/III (1997年-1999年)
- 特徴
- マルチメディア命令セット(MMX, SSE)の導入。
- 改良
- パイプラインの拡張とパフォーマンスの向上。
- Intel Pentium 4 (NetBurst, 2000年)
- 特徴
- 高クロック速度を目指した非常に深いパイプライン。
- 改良
- 高帯域幅のシステムバス。
- Intel Core (2006年)
- 特徴
- 高効率、低消費電力設計。
- マルチコア
- デュアルコアおよびクアッドコアの導入。
- Intel Nehalem (2008年)
- 特徴
- 集中型メモリコントローラーの統合、Hyper-Threadingの復活。
- QPI
- QuickPath Interconnectの導入。
- Intel Sandy Bridge (2011年)
- 特徴
- マイクロアーキテクチャとグラフィックスの統合。
- 改良
- 高性能なAVX命令セットの導入。
- Intel Ivy Bridge (2012年)
- 特徴
- 22nmプロセス技術、トライゲートトランジスタの導入。
- 改良
- 電力効率の向上。
- Intel Haswell (2013年)
- 特徴
- 低消費電力での高性能。
- AVX2
- 新しいAVX命令セットの導入。
- Intel Skylake (2015年)
- 特徴
- より高度な電力管理機能、マイクロアーキテクチャの効率向上。
- 改良
- 新しいメモリサポート(DDR4)。
- Intel Kaby Lake (2016年)
- 特徴
- パフォーマンスの最適化と4Kメディア処理の向上。
- 改良
- パフォーマンスの微調整。
- Intel Coffee Lake (2017年)
- 特徴
- コア数の増加(最大6コア/12スレッド)。
- 改良
- パフォーマンスのさらなる向上。
- Intel Ice Lake (2019年)
- 特徴
- 10nmプロセス技術、Sunny Coveコアの導入。
- AI
- 新しいAIアクセラレーション機能。
- Intel Tiger Lake (2020年)
- 特徴
- 10nm SuperFin技術、Willow Coveコア。
- 改良
- Xeグラフィックスの統合。
- Intel Alder Lake (2021年)
- 特徴
- ハイブリッドアーキテクチャ(高性能コアと高効率コアの混在)。
- 改良
- Intel 7プロセス技術。
- AMD K5(1996年)
- 特徴
- 初のAMD製x86互換プロセッサ。
- パフォーマンス
- 比較的低い。
- AMD Athlon(1999年)
- 特徴
- 高性能x86プロセッサ。
- 競争力
- Intelと対抗できる性能を持つ。
- AMD Opteron(2003年)
- 特徴
- 初のx86-64プロセッサ。
- 市場
- サーバーおよびワークステーション市場向け。
- AMD Ryzen(2017年)
- 特徴
- Zenアーキテクチャ、競争力のあるマルチコア性能。
- 市場
- デスクトップ、ラップトップ、サーバー向け。
x86アーキテクチャのマイクロアーキテクチャは、パフォーマンス、効率性、機能性の向上を目指して絶えず進化し続けています。これにより、x86プロセッサは広範な用途で使用されるようになっています。
8086のレジスター
編集i8086は、Intelが1978年に発表した16ビットのマイクロプロセッサで、IBM PCや互換機などで使用されました。i8086は16ビットのレジスタを持ち、これらのレジスタはさまざまな用途に使用されました。
以下に、i8086のレジスタを紹介します。
- AXレジスタ:16ビットのデータを格納することができます。AXレジスタは、AL(下位8ビット)とAH(上位8ビット)に分かれており、これらを別々に操作することもできます。
- BXレジスタ:AXレジスタと同様に16ビットのデータを格納することができます。BXレジスタは、SI(ソース・インデックス)やDI(デスティネーション・インデックス)とともに、メモリ転送命令で使用されます。
- CXレジスタ:ループ処理に使用されます。CXレジスタには、カウンタの値が格納されます。
- DXレジスタ:入出力操作に使用されます。
- SIレジスタ:メモリ転送や文字列命令でソースをポインティングします。
- DIレジスタ:メモリ転送や文字列命令でディスティネーションをポインティングします。
- BPレジスタ:プロシージャコールのスタックフレーミングに使用されます。
- SPレジスタ:SSレジスタと組み合わせてスタック上位のオブジェクトをポインティングします。
- IPレジスタ:実行中のプログラムをポインティングします。
- FLAGSレジスタ:キャリーやゼロなどのフラッグのセットです。
i8086では、メモリアドレスはセグメント化されていました。セグメントは、16ビットのセグメント・レジスタと16ビットのオフセット値で表され、物理アドレスを計算するために使用されます。i8086のセグメントレジスタには、CS(コード・セグメント)、DS(データ・セグメント)、ES(エクストラ・セグメント)、SS(スタック・セグメント)があります。
たとえば、CSレジスタには、実行中のコードが保存されているセグメントのアドレスが格納されます。オフセット値は、CSレジスタの値と命令ポインタ(IP)レジスタの値を組み合わせて計算されます。オフセット値とセグメントレジスタの値を組み合わせることで、物理アドレスが計算されます。
i8086のセグメント化されたアドレスは、プログラムの実装が複雑であるため、後継のプロセッサではセグメンテーションを簡略化する傾向があります。
まず、8080と8086の両方には、汎用レジスタがあります。8080には6つの汎用レジスタがあり、それぞれB、C、D、E、H、Lと呼ばれます。
一方、8086には8つの汎用レジスタがあり、それぞれAX、BX、CX、DX、SI、DI、BP、SPと呼ばれます。これらのレジスタは、両方のプロセッサで算術演算やデータ転送に使用されます。
さらに、8080と8086の両方には、プログラムカウンタとスタックポインタがあります。8080のプログラムカウンタはPCと呼ばれ、スタックポインタはSPと呼ばれます。同様に、8086のプログラムカウンタはIPと呼ばれ、スタックポインタはSPとBPの2つがあります。
最後に、8080と8086の両方にフラグレジスタがあります。8080のフラグレジスタには、Carry、Parity、Auxiliary Carry、Zero、Sign、およびOverflowフラグが含まれます。8086のフラグレジスタには、Carry、Parity、Auxiliary Carry、Zero、Sign、およびOverflowフラグに加えて、DirectionとInterruptフラグも含まれます。
したがって、8080と8086のレジスタ構成にはいくつかの類似点がありますが、基本的には異なるアーキテクチャに基づいています。
セグメントとオフセットから実アドレスを得る方法
編集i8086は古いx86アーキテクチャの一部であり、セグメントとオフセットを使用してメモリアドレスを表します。セグメントは16ビットのレジスタで、オフセットも16ビットです。i8086では、これら2つの値を組み合わせて20ビットの実アドレスを生成します。
以下に、セグメントとオフセットから実アドレスを計算する方法を示します。
- セグメントレジスタとオフセットレジスタの値を16ビットの値として取得します。
- セグメントレジスタの値を16ビット左シフトします(乗算します)。
- オフセットレジスタの値を加算します。
- 2と3で得られた値を加算すると、20ビットのアドレスが得られます。
これはリアルモードの例です。
- タイニー(Tiny):コード、データ、スタックが同一の64KB以下のメモリ空間に収まる小さなプログラムに使用されます。.COM のメモリーモデルです。
- スモール(Small):コードは64KB以下、データ、スタック64KBのメモリ空間に収まるプログラムに使用されます。
- コンパクト(Compact):コードは64KB以下、データ、スタックは64KB以上のメモリ空間に収まるプログラムに使用されます。
- ミディアム(Medium):コード64KB以上、データ、スタックは64KB以下のメモリ空間に収まるプログラムに使用されます。
- ラージ(Large):コード、データ、スタックのすべてが64KB以上のメモリ空間に収まるプログラムに使用されます。
- ヒュージ(Huge):コード、データ、スタックのすべてが64KB以上のメモリ空間に収まるプログラムに使用されます。1つのオブジェクトのサイズが64KBを超えることができます。
これらのメモリーモデルは、プログラムが必要とするメモリの量に応じて、最適なメモリモデルを選択できるようにしました。
しかし、現代のコンピュータでは、これらのメモリモデルは使用されておらず、代わりに32ビットまたは64ビットのリニアアドレッシングを使用して、より大きなメモリ空間にアクセスできるようになっています。浮動小数点コプロセッサー
編集X87は、インテルが開発した初期の浮動小数点コプロセッサで、x86アーキテクチャの一部として使用されました。 X87は、8087と呼ばれる最初のバージョンが導入され、後に80287、80387などのより高速なバージョンが登場しました。80187は80186に接続できるよう調整された80387です。
X87は、CPUとは別のチップとして設計され、CPUと接続されていました。浮動小数点演算は、X87コプロセッサで処理され、結果がCPUに返されました。このアーキテクチャは、浮動小数点演算を高速化するために開発されました。
X87コプロセッサは、浮動小数点演算を行うためにスタックベースのレジスタセットを使用していました。 つまり、演算の対象となるデータがスタックにプッシュされ、演算が行われた結果がスタックからポップされます 。このスタック方式は、プログラムが複雑な浮動小数点演算を行う場合に非常に有用でした。
X87は、浮動小数点演算の精度を高めるために、80ビットの拡張精度浮動小数点フォーマットをサポートしていました。 これにより、CPUが提供する標準的な32ビットまたは64ビットの浮動小数点フォーマットよりも高い精度で計算ができました。
しかし、X87コプロセッサは、x86アーキテクチャの一部として標準化されてのはPentiumまで待つ必要がありました。 これは、プログラムがX87コプロセッサに依存することにより、プログラムの移植性が低下する可能性がありました。
マルチメディア拡張 (MMX)
編集マルチメディア拡張 (MMX) は、インテルが開発した、Pentiumプロセッサ向けのSIMD型拡張命令セットです。1997年に発売され、音声や動画処理などのマルチメディアアプリケーションのパフォーマンスを向上させるために設計されました。
MMXは、従来のCPU命令よりも高速にマルチメディア処理を実行できるように設計されていました。これは、以下の利点をもたらしました。
- 音声・動画編集の高速化: MMXは、音声や動画のエンコード・デコード処理を高速化し、編集作業をよりスムーズにしました。
- ゲームのパフォーマンス向上: MMXは、3Dグラフィックス処理を高速化し、より滑らかなゲームプレイを実現しました。
- Webブラウジングの高速化: MMXは、画像処理を高速化し、Webブラウジングの速度向上に貢献しました。
MMXは、以下の技術を基盤としています。
- SIMD (Single Instruction Multiple Data): 1つの命令で複数のデータを並列処理する技術です。MMXは、整数演算や浮動小数点演算に加え、MMXレジスタと呼ばれる専用のレジスタを使用して、SIMD処理を実行することができました。
- MMXレジスタ: 64ビット幅の専用レジスタで、最大8個の整数データまたは4個の浮動小数点データを格納することができます。MMX命令は、MMXレジスタを使用して、複数のデータを並列処理することができました。MMXレジスタはX87スタックと同じ領域にあるので、MMXとX87命令は排他利用となります。
- MMX命令セット: 57個の命令で構成され、整数演算、浮動小数点演算、データ転送、論理演算など、様々なマルチメディア処理に必要な命令が含まれていました。
MMXは、以下の様な具体的な処理を高速化しました。
- 画像処理: 画像の拡大・縮小、回転、カラー変換などの処理を高速化しました。
- 音声処理: 音声の圧縮・伸張、エコーキャンセル、ノイズ除去などの処理を高速化しました。
- 動画処理: 動画の圧縮・伸張、フレームレート変換、解像度変換などの処理を高速化しました。
MMXは、発売当初大きな成功を収め、多くのPCに搭載されました。その後、SSE (Streaming SIMD Extensions) などのより高度な拡張命令セットが登場し、MMXは徐々に取って代わられました。しかし、MMXは、マルチメディア処理におけるSIMD技術の重要性を世に知らしめた画期的な技術として、歴史に名を残しています。
- SSE (Streaming SIMD Extensions): MMXの後継となる拡張命令セット。より多くのデータ型と演算をサポートし、さらに高速な処理を実現しました。
- AVX (Advanced Vector Extensions): SSEの後継となる拡張命令セット。さらに多くのデータ型と演算をサポートし、さらに高速な処理を実現しました。
- GPGPU (General Purpose GPU Computing): 本来グラフィック処理用として設計されたGPUを、汎用的な計算タスクに使用する方法。MMX、SSE、AVXなどの拡張命令セットをGPUで実行することで、さらに高速な処理を実現することができます。
今日では、X87コプロセッサ命令及びMMXはほとんど使用されておらず、ほとんどのx86プロセッサにはSSEまたはその後継のAVX(Advanced Vector Extensions)が組み込まれています。ただし、X87は、浮動小数点演算を行うための古典的な方法として、教育用途やレガシーシステムのサポートなどでまだ使用されている場合があります。
Am9511は、AMDが開発した最初の数値演算プロセッサの1つであり、当時は主に科学技術計算用途に使用されていました。Am9511は、8ビットのマイクロプロセッサに接続され、浮動小数点演算を高速かつ正確に実行することができます。Am9511は、スタック指向のアーキテクチャを採用しており、データはスタックに積まれ、演算子が適用されます。このアーキテクチャは、逆ポーランド記法を使用する逆ポーランド電卓と似た構造を持っています。
一方、X87は、インテルが開発した数値演算プロセッサであり、主にPC用途に使用されていました。X87は、Am9511よりも高度な機能を備えており、倍精度演算やトランセンデント関数の処理にも対応しています。X87も、スタック指向のアーキテクチャを採用しており、データはスタックに積まれ、演算子が適用されます。
これら2つの数値演算プロセッサには、演算を内部スタックを対象に行う共通点があります。スタックは、一時的なメモリ領域であり、Am9511とX87は、演算に必要なデータをスタックにプッシュして、演算結果をスタックからポップします。これにより、Am9511とX87は、複雑な数値演算をメモリーアクセスなしに非常に高速に実行することができます。
ただし、Am9511とX87は、プログラムや命令の互換性はありません。プロテクトモード(80286)
編集Intel 80286は、16ビットx86マイクロプロセッサで、1982年にリリースされました。 80286では、アドレスバスが従来の20ビットから24ビットに拡張され、16MBまでのアドレス空間をサポートするようになりました。 増加したアドレス空間を利用するために新たなアドレシングモード「プロテクトモード」が追加され、従来のセグメントモデルのアドレッシングモードには「リアルモード」という名前が追号されました[1]。リセット直後の80286はリアルモードで起動します。
リアルモードでは、80286は8086と互換性があり、1MBのメモリ空間にアクセスできます。
一方、プロテクトモードでは、80286は16MBの物理メモリ空間にアクセスできます。
プロテクトモードに入るには、次の手順が必要です。
- GDT(グローバルディスクリプタテーブル)の設定:GDTは、セグメントディスクリプタを格納するテーブルです。セグメントディスクリプタは、セグメントの情報を格納しており、プロテクトモードでは、これらのディスクリプタがセグメントの保護とアクセス権限を定義します。
- IDT(割り込みディスクリプタテーブル)の設定:IDTは、割り込みベクタのアドレスを格納するテーブルです。プロテクトモードでは、IDTが割り込み処理を定義します。
- CR0(コントロールレジスタ0)の設定:CR0は、CPUのモード、キャッシュ、割り込みの有効化など、CPUの動作に関する設定を行うレジスタです。プロテクトモードに入るには、PE(プロテクト拡張)ビットを1に設定する必要があります。
これらの設定が完了すると、80286はプロテクトモードに入り、アクセス保護が有効になります。また、80286は、特権レベルと呼ばれる概念を導入し、プロテクトモードでのアクセス権限を定義します。特権レベルは、0から3の値を持ち、0が最高特権レベルで、3が最低特権レベルです。
プロテクトモードでは、各セグメントにアクセス権限が設定されており、CPUは各アクセスに対してアクセス保護を適用します。また、80286は、仮想記憶をサポートしており、仮想アドレスと物理アドレスのマッピングを行います。
このように80286のリアルモードではディスクリプターをメモリ保護・メモリ管理・特権管理の要としています。 しかし、80286が発売された1982年にはプロテクトモードを活かして設計されたオペレーティングシステムは一般向けに普及しせず、プロテクトモードを前提とするWindows3.0(スタンダードモード)の発売は1990年まで待つ必要があり、本格的にリングプロテクション機構を利用したOS/2 1.x の登場はそれより早い1987年でしたが広く普及するには至りませんでした。
A20ラインは、80286のアドレスバス上の21ビット目を制御する信号線です。この信号線の制御により、80286は1MBを約64KB超えるメモリ領域(HMA)を直接アクセスすることができます。一方、A20ラインが制御されない場合、80286は20ビットまでのアドレスしか扱えず、1MBを超えるメモリにアクセスすることができません。
しかし、A20ラインの制御は簡単ではありませんでした。初期のPCでは、A20ラインはキーボードコントローラの一部である8042チップによって制御されていました。しかし、この方式ではA20ラインの制御が不安定であり、特にシステムがリセットされたときに問題が発生することがありました。
そこで、後にはA20ラインの制御には別の方法が採用されるようになりました。具体的には、80286以降のCPUには、A20ラインを制御するための特別な制御信号が追加されました。また、BIOSやOSなどのソフトウェアも、A20ラインの制御に対応するように改良されました。
しかし、A20ラインに関する問題は、PC業界全体に影響を与えました。特に、MS-DOSやWindowsなどの古いオペレーティングシステムでは、A20ラインの制御に関する問題が多数報告されました。このため、A20ラインの制御に関する知識は、PC技術者にとって基礎的なものとなりました。
現在では、A20ラインの制御に関する問題はほとんど解決されています。しかし、80286以降のCPUには今でもA20ラインの制御信号が存在しており、メモリアクセスにおいて重要な役割を果たしています。80286にはプロテクトモードにいったん入った後、リアルモードに戻る直接的方法が提供されていませんでした。 IBMはその対処として、キーボードコントローラーからCPUをリセットする技法を考案しました。
IA-32
編集IA-32という呼称自体は、インテルが新しい64ビットアーキテクチャであるIA-64を発表した際にはじめて使われた用語で、80386が発表された当時は単に32ビット命令セットや32ビット拡張と呼ばれていました。
80386では、データバスが従来の16ビットから32ビットとなり、より大きな幅のレジスターをサポートすることになりました。
- EAX、EBX、ECX、EDX、EBP、ESP、EDI、ESI、EIP、EFLAG:従来のレジスターの32ビット版です。
- FS、GS
- セグメントレジスターは16ビットのままですが、2つのセグメントレジスターが増えました。
32ビットアドレッシング
編集32アドレッシングは、x86アーキテクチャにおいて、32ビットのアドレス空間を使用する方法です。これにより、最大4GBのメモリ空間にアクセスすることができます。
32アドレッシングでは、メモリアドレスは32ビットの値で表されます。これは、32ビットレジスタ(EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP)によって参照されます。レジスタは、直接アドレス指定モードで使用される場合と、間接アドレス指定モードで使用される場合があります。
直接アドレス指定モードでは、レジスタにアドレスが直接格納されます。たとえば、次のようなコードがあります。
MOV EAX, DWORD PTR [0x12345678]
これは、0x12345678のアドレスにあるDWORD(32ビット)をEAXレジスタにロードするために使用されます。
間接アドレス指定モードでは、レジスタに格納されたアドレスが指すメモリの内容にアクセスします。たとえば、次のようなコードがあります。
MOV EAX, DWORD PTR [EBX+8]
これは、EBXレジスタに格納されたアドレスに8を加えたアドレスにあるDWORDをEAXレジスタにロードするために使用されます。
32アドレッシングモードでは、多くの異なるアドレッシングモードがサポートされています。これらには、レジスタ間接アドレッシング、スケールされたインデックスアドレッシング、ベースアドレッシング、インデックスベースアドレッシング、そして相対アドレッシングが含まれます。
レジスタ間接アドレッシングは、単純な間接アドレッシングであり、レジスタに格納されたアドレスが指すメモリにアクセスします。スケールされたインデックスアドレッシングは、基本アドレスにインデックスを掛けてアクセスする方法です。ベースアドレッシングは、基本アドレスにオフセットを加えてアクセスする方法です。インデックスベースアドレッシングは、インデックスとベースレジスタを組み合わせてアクセスする方法です。相対アドレッシングは、基本アドレスにオフセットを加えてアクセスする方法ですが、オフセットはリテラル値で与えられます。
仮想86モード
編集仮想86モードとは、x86アーキテクチャにおいて32ビットプロテクトモードで動作しているアプリケーションが、16ビットリアルモードで動作しているように見せかけるモードのことです。仮想86モードでは、プロテクトモードで実行されているアプリケーションが、リアルモードのアドレッシングを使用することができます。これにより、プロテクトモードで実行されているアプリケーションが、リアルモードのアプリケーションと同じ方法で、BIOSやハードウェアの割り込みを使用することができます。
- 仮想86モードの有効化
- 仮想86モードを有効にするには、以下の手順を実行する必要があります。
- ページディレクトリレジスタ(CR3)に、ページングテーブルを指すアドレスをロードします。
- 制御レジスタ4(CR4)のVMフラグをセットします。
- タスクステートセグメント(TSS)のトラップビットをセットします。
- IRET命令を使用して、仮想86モードに切り替えます。
- 仮想86モードの制限
- 仮想86モードには、以下のような制限があります。
- 仮想86モードでは、16ビットリアルモードの制限が適用されます。たとえば、セグメントレジスタによるアドレッシングしか使用できないなどの制限があります。
- 仮想86モードで実行されるプログラムは、プロテクトモードで実行されるプログラムよりも制限されたアクセス権を持ちます。
- 仮想86モードでは、プロテクトモードで使用できる一部の命令が使用できない場合があります。
- 仮想86モードでは、I/Oポートアクセスに制限があります。アクセスできるポートは、特権レベル0(Ring0)で実行されるコードがアクセスできるポートと同じ範囲に制限されます。
MMXレジスター
編集MMX(Multi-Media eXtensions)は、インテルが開発したSIMD(Single Instruction Multiple Data)命令セット拡張です。MMXは、整数型データを高速に処理するための拡張命令セットで、主にマルチメディアアプリケーションやグラフィック処理に使用されます。MMX命令は、MMXレジスタに対して操作を行います。
MMXレジスタは、64ビットのレジスタで、64ビットの整数値を格納できます。MMX命令は、2つのMMXレジスタを対象に演算を行い、その結果を別のMMXレジスタに格納します。MMXレジスタは、通常の汎用レジスタとは別に管理されます。
MMXレジスタには、8つのレジスタがあります。それぞれのレジスタは、mm0からmm7までの名前で識別されます。MMXレジスタは、float型データと整数型データの両方を扱うことができます。ただし、MMXレジスタは、浮動小数点演算をサポートしていないため、浮動小数点数の演算を行う場合は、XMMレジスタを使用する必要があります。
MMXレジスタは、以下のような命令で使用されます。
- 加算命令:PADD, PADDS, PADDSW, PADDB, PADDW, PADDD
- 減算命令:PSUB, PSUBS, PSUBSW, PSUBB, PSUBW, PSUBD
- 乗算命令:PMUL, PMULLW, PMULHW, PMULHUW
- ビット演算命令:PAND, PANDN, POR, PXOR
- ムーブ命令:MOVD, MOVDQU, MOVQ, MOVNTQ
MMX命令は、MMXレジスタに対する演算を高速に実行することができます。MMXレジスタには、SSE命令と同様に、128ビットのXMMレジスタとの相互変換が可能な命令もあります。
また、MMX命令は、CPUによって自動的にパイプライン化されるため、処理速度を向上させることができます。ただし、MMX命令は、通常の整数演算命令と混在することができないため、注意が必要です。
MMXレジスタはX87の演算スタックとレジスタファイルを共有しているので、MMXとX87命令とは共存できません。
SSEレジスター
編集SSE(Streaming SIMD Extensions)は、インテルが開発したSIMD(Single Instruction Multiple Data)命令セットの一種であり、同時に複数のデータを処理することができます。SSE命令を使用する場合、データはSSEレジスタにロードされます。
SSEレジスタは、XMM0からXMM15までの16個の128ビットレジスタで構成されています。これらのレジスタは、64ビットまたは32ビットの整数、単精度または倍精度の浮動小数点数など、さまざまなデータ型を格納することができます。SSEレジスタは、MMXレジスタと同様に浮動小数点数の精度を向上させることができます。
SSEレジスタは、XMM0からXMM7までのレジスタを使用するSSE命令と、XMM8からXMM15までのレジスタを使用するSSE2命令に分類されます。SSE3以降の命令では、SSEレジスタ全体が使用されることがあります。
SSE命令を使用する場合、SSEレジスタにデータをロードしてから、適切なSSE命令を使用してデータを処理します。たとえば、以下の例は、XMM0レジスタに単精度浮動小数点数をロードし、XMM1レジスタにもう1つの単精度浮動小数点数をロードし、それらを加算するSSE命令を示しています。
movss xmm0, [float_var_1] movss xmm1, [float_var_2] addss xmm0, xmm1
このコードでは、movss命令を使用して、float_var_1とfloat_var_2という2つの単精度浮動小数点数を含むメモリ位置からデータをロードします。その後、addss命令を使用して、XMM0レジスタとXMM1レジスタの値を加算し、結果をXMM0レジスタに格納します。
SSEレジスタを使用することで、データ処理の効率が向上し、処理速度が高速化されることがあります。ただし、SSE命令は、CPUがSSEに対応していることを前提としているため、古いCPUでは使用できない場合があります。
SSE命令の世代
編集SSE(Streaming SIMD Extensions)は、インテルが開発したSIMD(Single Instruction Multiple Data)命令セットアーキテクチャの1つであり、CPUで高速な浮動小数点演算、整数演算、およびメモリアクセスを実現するために使用されます。SSEは、CPUの内部でベクトル演算を行い、1つの命令で複数のデータを同時に処理することができます。SSEは、マルチメディア処理、3Dグラフィックス、科学技術計算などのアプリケーションで広く使用されています。
- SSE
最初のSSE命令セットは、1999年にインテルのPentium IIIプロセッサで導入されました。このバージョンは、128ビットのXMMレジスタを使用し、浮動小数点数の加算、減算、乗算、除算などの基本的な演算をサポートしています。また、整数演算とメモリアクセスにも対応しています。
- SSE2
SSE2は、2000年に導入されたSSEの拡張バージョンであり、SSEの機能を拡張しました。SSE2は、128ビットと64ビットのXMMレジスタをサポートし、整数演算、浮動小数点演算、およびメモリアクセスに対応しています。SSE2は、SSEよりも高速な浮動小数点演算を実現し、64ビット整数演算をサポートするなどの機能を提供しています。SSE2は、AMD Athlon 64やIntel Pentium 4などのプロセッサでサポートされています。
- SSE3
SSE3は、2004年に導入されたSSE2の拡張バージョンであり、新しい命令と改良された命令を追加しました。SSE3は、浮動小数点演算、整数演算、およびメモリアクセスに対応しており、浮動小数点数の丸め、整数演算の改良、キャッシュミスの最適化などを実現しています。SSE3は、Intel Pentium 4やIntel Core 2 Duoなどのプロセッサでサポートされています。
- SSE4.0
SSE4.0は、2006年に導入されたSSE命令の世代です。SSE4.0では、新しい命令が導入され、より高速な処理が可能になりました。以下は、SSE4.0で導入された主な命令です。
- PCMPESTRI/PSCALED: テキスト文字列とパターンを比較する命令。
- PCMPESTRM: バイト列とパターンを比較する命令。
- PCMPEQQ: 128ビット整数値の等値比較を行う命令。
- BLENDPD/BLENDPS: 2つの128ビット浮動小数点ベクトルをブレンドする命令。
- DPPS/DPPD: 2つの128ビットベクトルのドット積を計算する命令。
- SSE4.1
SSE4.1は、2007年に導入されたSSE命令の世代です。SSE4.1では、SSE4.0で導入された命令に加えて、新しい命令が導入されました。以下は、SSE4.1で導入された主な命令です。
- PABSB/PABSW/PABSD: 2つの128ビット整数ベクトルの絶対値を計算する命令。
- PMULDQ: 2つの128ビット整数ベクトルの積を計算する命令。
- PMINSB/PMINSD: 2つの128ビット整数ベクトルの最小値を計算する命令。
- PMAXSB/PMAXSD: 2つの128ビット整数ベクトルの最大値を計算する命令。
- ROUNDPS/ROUNDPD: 2つの128ビット浮動小数点ベクトルの丸めを行う命令。
AMD64
編集AMD64は、x86アーキテクチャの64ビット拡張です。AMD64アーキテクチャは、従来の32ビットのx86アーキテクチャに加えて、拡張された64ビットレジスタや命令セット、新しいレジスタとモードを追加しています。AMD64は、より大きな仮想アドレス空間をサポートし、64ビットアプリケーションの作成を可能にしました。
以下は、AMD64のアセンブリ言語についての基本的な概念や文法の説明です。
- レジスタ
- AMD64アーキテクチャは、16本の64ビット汎用レジスタを持っています。これらは、RAX、RBX、RCX、RDX、RSI、RDI、RBP、RSP、R8~R15の名前で識別されます。
- メモリアクセス
- メモリアクセスは、MOV命令を使用して行われます。メモリアドレスは、次のような形式で指定されます。
[ベース + インデックス * スケール + オフセット]
- ベース、インデックス、スケール、オフセットはすべて省略可能で、それぞれ0がデフォルト値として使用されます。以下は、いくつかの例です。
mov rax, [rbx] ; rbxのアドレスにある64ビットデータをraxにロード mov [rax], rbx ; rbxの値をraxが指すアドレスにストア mov rax, [rbx + 8] ; rbx + 8のアドレスにある64ビットデータをraxにロード
- スタック
- スタックは、RSPレジスタを使用してアクセスされます。PUSHおよびPOP命令を使用して、スタックにデータをプッシュしたりポップしたりできます。
push rax ; スタックにraxの値をプッシュ pop rax ; スタックから値をポップしてraxに格納
- 関数呼び出し
- 関数呼び出しは、CALL命令を使用して行われます。関数呼び出しの前に、引数をスタックにプッシュし、関数の戻り値をRAXレジスタに格納することが一般的です。
push arg1 ; arg1をスタックにプッシュ push arg2 ; arg2をスタックにプッシュ call function ; 関数を呼び出す add rsp, 16 ; スタックポインタを復元する
AVX命令とZMMレジスター
編集ZMMレジスタは、Intel AVX(Advanced Vector Extensions)命令セットの一部であり、256ビット幅の浮動小数点数または整数のベクトル演算をサポートします。これらのレジスタは、AVX-512拡張命令セットで更に拡張され、512ビット幅の浮動小数点数または整数のベクトル演算をサポートします。
以下の学術論文は、ZMMレジスタに関する詳細な情報を提供しています。
- Intel® 64 and IA-32 Architectures Software Developer's Manual, Volume 2A: Instruction Set Reference, A-M - この文書は、Intel® 64およびIA-32アーキテクチャの命令セットのリファレンスを提供する公式の技術文書です。ZMMレジスタについて詳しく説明されています。
- "Intel AVX-512 Instructions and Their Use in ResNet-50 Deep Learning" by Pavel Drobot and Alexander Semenov - この論文は、AVX-512拡張命令セットについて詳しく説明し、ZMMレジスタを使用したDeep Learningアルゴリズムの実装について説明しています。
- "An Optimized Software Implementation of the SHA-256 Hash Function for Multi-Core and Many-Core Intel Architectures" by Martijn B. van Leeuwen - この論文は、SHA-256ハッシュ関数の最適化されたソフトウェア実装について説明し、ZMMレジスタの使用について説明しています。
これらの文献を参照することで、ZMMレジスタに関する深い理解を得ることができます。
AVX2
編集X86アセンブラにおけるAVX2(Advanced Vector Extensions 2)は、256ビットのベクトル演算をサポートする命令セット拡張です。これにより、浮動小数点数や整数などのデータを一度により多くのデータ要素で処理できるようになります。以下にAVX2に関する詳細を示します。
AVX2の主な特徴:
256ビット幅のYMMレジスタを使用し、命令によっては複数のデータ要素を同時に処理できます。 整数演算に加え、浮動小数点数演算もサポートします。 FMA(Fused Multiply-Add)命令が追加され、一度の命令で乗算と加算を同時に行うことができます。 他の拡張命令セットとの互換性があり、SSEやAVXなどの命令セットと同時に使用できます。 以下は、AVX2の命令の例です。AVX2命令の一部について説明し、Intelの公式ドキュメントへのリンクを提供します。
- VADDPS:ベクトルの加算
- YMMレジスタの2つのベクトルを加算し、結果を同じYMMレジスタに格納します。例えば、次の命令は、YMM1およびYMM2レジスタの2つの256ビットの浮動小数点数ベクトルを加算します。
VADDPS ymm1, ymm1, ymm2
詳細については、Intelの公式ドキュメントを挙げることができます。Intelの開発者向けウェブサイト( https://software.intel.com/content/www/us/en/develop/articles/introduction-to-intel-advanced-vector-extensions.html )には、AVX2に関する詳細な情報が含まれています。このページでは、AVX2の概要、サポートされている命令、およびプログラミングのヒントが説明されています。
また、AVX2に関するさまざまなアセンブリコードの例を提供する多数のWebサイトがあります。たとえば、Assembly Language Programmingというサイト( http://www.assemblylanguagetuts.com/avx2-introduction/ )では、AVX2に関する基本的なアセンブリコードを説明しています。
脚註
編集- ^ System/360などのメインフレームをご存知の方は、プロテクトモードとリアルモードの名前が逆に感じるかもしれません。