x86命令セットとは、 x86互換のマイクロプロセッサがサポートする命令セットを指します。命令は通常、実行可能プログラムの一部であり、多くの場合、コンピュータ ファイルとして保存され、プロセッサ上で実行されます。
x86命令セットは数回拡張され、より広いレジスタとデータ型、そして新しい機能が導入されました。[1]
x86 整数命令
以下は、Intel の完全な8086 / 8088命令セット (合計 81 命令)です。 [2]これらの命令は 32 ビット モードでも使用可能で、 16 ビット ( ax、bxなど) ではなく32 ビット レジスタ ( eax、ebxなど) と値を操作します。更新された命令セットは、アーキテクチャ ( i186、i286、 i386 、i486、i586 / i686 )ごとにグループ化されており、 (32 ビット) x86および (64 ビット) x86-64 ( AMD64とも呼ばれます) と呼ばれます。
オリジナルの8086/8088の説明書
これはオリジナルの命令セットです。「注」列のrはレジスタ、m はメモリ アドレス、imm は即値(つまり値) を意味します。
特定のプロセッサに追加
追加されたもの80286
80286 で追加された新しい命令により、x86保護モードのサポートが追加されました。一部の命令はリアル モードでも使用できますが、すべてではありません。
- ^ abcd 、、および命令で使用される記述子は、2つの部分からなるデータ構造で構成されています。最初の部分は 16 ビット値で、テーブル サイズをバイト単位で - 1 で指定します。2 番目の部分は 32 ビット値 (64 ビット モードでは 64 ビット値) で、テーブルの線形開始アドレスを指定します。16ビットのオペランド サイズのおよびの場合、アドレスは 00FFFFFFh と AND 演算されます。Intel (AMD ではない) CPU では、 16 ビットのオペランド サイズのおよび命令は、Intel SDM リビジョン 079 (2023 年 3 月) の時点で、最後のバイトが 0 に設定された記述子をメモリに書き込むことが文書化されています。ただし、観察された動作では、代わりに記述子テーブル アドレスのビット 31:24 が書き込まれます。[3]
LGDTLIDTSGDTSIDTLGDTLIDTSGDTSIDT - ^ abcd 、、および命令は、Pentium以降のプロセッサではシリアル化されます。
LGDTLIDTLLDTLTR - ^ この命令は、 Pentium
LMSW以降の Intel プロセッサではシリアル化されますが、AMD プロセッサではシリアル化されません。 - ^ 80386以降では、「マシンステータスワード」は CR0制御レジスタと同じですが、命令はこのレジスタの下位4ビットのみを変更でき、ビット0をクリアすることはできません。ビット0をクリアできないということは、 x86保護モードに入ることはできますが、終了することはできないことを意味します。80286では、 CPUリセットなしでは保護モードを終了することはできません([4]でも[5]でも) 。80386以降では保護モードを終了することは可能ですが、80386以降のto命令を使用する必要があります。
LMSWLMSWLMSWLOADALLMOVCR0 - ^ が設定されている場合、、、、命令はリング 0 でのみ実行できます。これらの命令は、2017 年に UMIP が導入されるまで、80286 以降のすべての x86 CPU で非特権でした。[ 5]
これは、ソフトウェアベースの仮想化にとって重大なセキュリティ問題でした。VM ゲストがこれらの命令を使用して、VM 内で実行されていることを検出できるためです。[6] [7]
CR4.UMIP=1SGDTSIDTSLDTSMSWSTR
- ^ abc 、、命令は、メモリ引数とともに使用される場合、常に 16 ビットのオペランド サイズを使用します。80386 以降のプロセッサでレジスタ引数を使用すると、より広い宛先オペランド サイズが使用可能になり、次のように動作します。
SMSWSLDTSTRSMSW: 完全なCR0 をx86-64ロング モードで保存します。それ以外の場合は未定義です。SLDT: Pentium Pro以降のプロセッサでは 16 ビット引数をゼロ拡張します。それ以前のプロセッサでは未定義です。STR: 16 ビット引数をゼロ拡張します。
- ^ 64 ビットロング モードでは、
ARPL命令は使用できません。63 /rオペコードは 64 ビット モード専用のMOVSXD命令に再割り当てされています。 - ^ この命令はリアルモードと仮想8086モード
ARPLで#UDを引き起こします。Windows 95とOS/2 2.xでは、この#UDを多用して、オペコードを1バイトのブレークポイントとして使用し、仮想8086モードからカーネルモードに移行することで知られています。[8] [9]63 - ^ このマスクのビット19:16は、Intel CPUでは「未定義」と記載されています。[10] AMD CPUでは、マスクは と記載されています
0x00FFFF00。 - ^ 2019年以降の一部のIntel CPU/マイクロコードの組み合わせでは、この命令はマイクロアーキテクチャデータバッファもフラッシュします。これにより、マイクロアーキテクチャデータサンプリングの
VERWセキュリティ脆弱性の回避策の一部として使用できるようになります。[11] [12] - ^ ab 文書化されていない、80286のみ。[4] [13] [14]
LOADALL( 80386には、異なるオペコードとメモリレイアウトを持つの異なるバリエーションが存在する。)
追加されたもの80386
80386 では、x86 命令セットに 32 ビット操作のサポートが追加されました。これは、汎用レジスタを 32 ビットに拡張し、OperandSizeとAddressSizeの概念を導入することで実現しました。以前は 16 ビット データ引数を取っていたほとんどの命令形式は、OperandSize を 32 ビットに設定することで 32 ビット引数を取ることができるようになり、16 ビット アドレス引数を取ることができる命令は、AddressSize を 32 ビットに設定することで 32 ビット アドレス引数を取ることができるようになりました。(8 ビット データで動作する命令形式は、OperandSize に関係なく 8 ビットのままです。16 ビットのデータ サイズを使用すると、32 ビット汎用レジスタの下位 16 ビットのみが変更され、上位 16 ビットは変更されません。)
各命令で使用するデフォルトの OperandSize と AddressSize は、現在のコード セグメントのセグメント記述子の D ビットによって指定されます。これによりD=0、両方とも 16 ビットになり、D=1両方とも 32 ビットになります。さらに、80386 で導入された 2 つの新しい命令プレフィックスを使用して、命令ごとにオーバーライドできます。
66h: OperandSize オーバーライド。 の場合は OperandSize を 16 ビットから 32 ビットに変更しCS.D=0、 の場合は 32 ビットから 16 ビットに変更しますCS.D=1。67h: AddressSize オーバーライド。 の場合は AddressSize を 16 ビットから 32 ビットに変更しCS.D=0、 の場合は 32 ビットから 16 ビットに変更しますCS.D=1。
80386 では、2 つの新しいセグメント レジスタFSと、GSx86制御、デバッグ、テスト レジスタも導入されました。
80386 で導入された新しい命令は、大きく分けて 2 つのクラスに分類できます。
- 32 ビット OperandSize バリアントに新しいニーモニックを必要とする既存のオペコード (例
CWDE:LODSD) - 新しい機能を導入した新しいオペコード (例
SHLD:SETcc)
命令の引数からオペランド サイズを推測できる命令形式 (たとえば、ADD EAX,EBX引数として EAX を使用しているため、32 ビットの OperandSize があると推測できる) の場合、新しい命令ニーモニックは必要なく、提供されません。
- ^ 32 ビット文字列命令の場合、±± 表記は、指定されたレジスタが、必要な場合は 4 ずつ後減分され
EFLAGS.DF=1、そうでない場合は 4 ずつ後増分されることを示します
。DS セグメントが指定されているオペランドの場合、DS セグメントはセグメント オーバーライド プレフィックスによってオーバーライドできます。ES セグメントが指定されている場合、セグメントは常に ES であり、オーバーライドできません。
使用するアドレス レジスタとして 16 ビット SI/DI レジスタを使用するか、32 ビット ESI/EDI レジスタを使用するかの選択は、プレフィックスでオーバーライド可能な AddressSize によって行われます67。 - ^ 32 ビット文字列命令は、古い 8/16 ビット文字列命令と同じように繰り返しプレフィックスを受け入れます。、、、および
の場合、プレフィックス( ) は、rCX (CX または ECX、AddressSize によって決定) で指定された回数だけ命令を繰り返し、各反復で rCX をデクリメントします (rCX=0 の場合は何も実行されず、次の命令に進みます)。およびの場合、( ) および( ) プレフィックスが使用可能で、命令を繰り返し、各反復で rCX をデクリメントしますが、フラグ条件 ( の場合は ZF=1 、 の場合は ZF=0 ) が真であり、rCX ≠ 0 である場合に限ります。LODSDSTOSDMOVSDINSDOUTSDREPF3CMPSDSCASDREPEF3REPNEF2REPEREPNE - ^ 命令の場合
INSB/W/D、メモリ アドレスのメモリ アクセス権は、ES:[rDI]ポート アクセスが実行されるまでチェックされない可能性があります。このチェックが失敗すると (ページ フォールトやその他のメモリ例外など)、ポートから読み取られたデータ項目は失われます。そのため、読み取り時に何らかの副作用が発生する I/O ポートにアクセスするためにこの命令を使用することは推奨されません。 - ^ I/O ポート アクセスは、 CPL≤IOPL の場合、またはアクセスするポートのI/O ポート許可ビットマップビットがすべて 0 に設定されている場合にのみ許可されます。
- ^ この命令は、AX の 16 ビット値を DX:AX レジスタ ペアの 32 ビット値に符号拡張する点で、
CWDE古い命令と異なります。CWDCWD - ^ オペコード ( / )の場合、命令が比較に を使用するか を使用するか(およびどのニーモニックを使用するか) の選択は、OperandSize ではなく AddressSize に基づきます (OperandSize は、ジャンプ先を 16 ビットに切り捨てるかどうかを制御します)。これは、ループ命令、、(オペコード、、 ) にも適用されますが、 /とは異なり、これらの命令には ECX を使用するバリアント用の新しいニーモニックは割り当てられていません。
E3JCXZJECXZCXECXLOOPLOOPELOOPNEE0E1E2JCXZJECXZ - ^ の場合
PUSHA(D)、スタックにプッシュされる SP/ESP の値は、命令の実行が開始される直前の値ですPUSHA(D)。 - ^ /の場合、 SP/ESP に対応するスタック項目はスタックからポップされます (メモリ読み取りを実行) が、 SP/ESP には配置されません。
POPAPOPAD - ^ および命令は、IOPL が 3 でない場合、仮想 8086 モードで実行すると#GP例外を引き起こします。 、、および命令は、IOPL が 3 でなく、VME が有効になっていない場合、仮想 8086 モードで実行すると #GP 例外を引き起こします。
PUSHFDPOPFDPUSHFPOPFIRETIRETD - ^ が
IRETDカーネルモードからユーザーモードに戻るのに使用され(CPLの変更を伴う)、SSで示されるユーザーモードのスタックセグメントが16ビットセグメントである場合、IRETD命令はスタックポインター(ESP/RSP)の下位16ビットのみを復元し、残りのビットは の前のカーネルコードの値を維持します。これにより、Linux(「ESPFIX」) [15]IRETDとWindowsの両方で複雑な回避策が必要になりました。[16]この問題は、後の64ビット命令にも影響します。IRETQ
- ^ abcd 、、および の手順については、次のとおりです。
BTBTSBTRBTC- 命令の最初の引数がレジスタ オペランドであり、2 番目の引数が即値である場合、2 番目の引数のビット インデックスはオペランド サイズを法として取得されます (16/32/64、実際にはインデックスの下位 4、5、または 6 ビットのみを使用します)。
- 最初の引数がメモリ オペランドで、2 番目の引数がレジスタ オペランドの場合、2 番目の引数のビット インデックスが完全に使用されます。これは、ビット テストに使用するメモリ アドレスをオフセットするために使用される符号付きビット インデックスとして解釈されます。
- ^ abc 、、命令は、メモリ引数とともに使用する場合、 ( ) プレフィックスを受け入れます。これにより、命令はアトミックに実行されます。
BTSBTCBTRLOCKF0 - ^ プレフィックスがオペコードと共に使用される場合、命令はBMI1 拡張をサポートするシステムで として実行されます。は とが異なりますが、ソース オペランドが 0 の場合にオペランド サイズを返すように定義されていません。他のソース オペランド値の場合、同じ結果が生成されます (フラグを除く)。
F30F BC /rTZCNTTZCNTBSFTZCNTBSR - ^ ab を
BSF実行し、BSRソース引数がすべて 0 の場合は EFLAGS.ZF フラグを 1 に設定し、それ以外の場合は 0 に設定します。
ソース引数がすべて 0 の場合、宛先レジスタは AMD プロセッサでは変更されないままになりますが、Intel プロセッサでは未定義の値に設定されます。 - ^ プレフィックスがオペコードと共に使用される場合、命令はABM または LZCNT 拡張をサポートするシステムでは として実行されます。ほとんどの入力値に対してとは異なる結果が生成されます。
F30F BD /rLZCNTLZCNTBSR - ^ ab および の場合、シフト量はマスクされます。下位 5 ビットは 16/32 ビットのオペランド サイズに使用され、6 ビットは 64 ビットのオペランド サイズに使用されます。およびが 16 ビットの引数を持ち、シフト量が 16 より大きい場合、結果は未定義になります。(実際の結果は Intel CPU によって異なり、少なくとも 3 つの異なる動作が知られています。[17] )
SHLDSHRDSHLDSHRD - ^ ab および命令でサポートされている条件コード(それぞれオペコードと、条件を指定する
xニブル) は次のとおりです。
SETccJcc near0F 9x /00F 8x - ^ の場合
SETcc、オペコードは一般に /0 と指定され、命令のModR/MSETccバイトのビット 5:3 が 000 になることを意味しますが、最近の x86 プロセッサ (Pentium 以降) はビット 5:3 を無視し、これらのビットの内容に関係なく命令を として実行します。 - ^ 、およびの場合、far ポインタのオフセット部分のサイズはオペランド サイズによって指定され、セグメント部分のサイズは常に 16 ビットです。64 ビット モードでは、これらの命令でプレフィックスを使用すると、Intel プロセッサでは 64 ビット オフセットのfar ポインタがロードされますが、AMD プロセッサではロードされません。
LFSLGSLSSREX.W - ^ abcdef 、、 およびレジスタ間の転送では、 ModR/Mバイトの reg 部分はレジスタを示すために使用され、r/m 部分は汎用レジスタを示すために使用されます。オペコードに特有の機能として、 ModR/Mバイトの上位 2 ビットは無視されます。これらのオペコードは、ModR/M バイトの上位 2 ビットがであるかのようにデコードされ、実行されます。
MOVCRxDRxTRxCRx/DRx/TRxMOV CRx/DRx/TRx11b - ^ abcd および レジスタ間の移動の場合、オペランド サイズは 64 ビット モードでは常に 64 ビット、それ以外の場合は 32 ビットになります。
CRxDRx - ^ グローバル ページをサポートするプロセッサ (Pentium 以降) では、グローバル ページ テーブル エントリは から − ではフラッシュされません
MOV。CR3代わりに、CR4.PGE ビットを切り替えることでこれらのエントリをフラッシュできます。PCID
をサポートするプロセッサでは、 PCIDが有効なときに CR3 に書き込むと、CR3 に書き込まれた値のビット 11:0 で指定された PCID に属する TLB エントリのみがフラッシュされます (このフラッシュは、書き込まれた値のビット 63 を 1 に設定することで抑制できます)。他の PCID に属するページのフラッシュは、代わりに CR4.PGE ビットを切り替える、CR4.PCIDE ビットをクリアする、またはINVPCID命令を使用することで実行できます。 - ^ Pentiumより前のプロセッサでは、 への移動は命令ストリームをシリアル化しません。この理由の 1 つとして、が保護モードやメモリ ページングを有効/無効にするために使用される場合、の直後にfar jump [18]を実行することが通常必要になります。はアーキテクチャ上はシリアル化としてリストされていますが、少なくとも一部の Intel Core-i7 プロセッサではシリアル化されていないことが報告されています。 [19]から(x86-64 で導入) は AMD プロセッサではシリアル化されますが、Intel プロセッサではシリアル化されません。
CR0MOVCR0MOVMOVCR2MOVCR8 - ^ ab この
MOV TRx命令はPentium以降では廃止されました。 - ^ / ( )命令は80386以降のすべての既知のIntel x86プロセッサに存在しますが[20] 、 Intelプロセッサについては2018年5月のIntel SDM(rev 067)リリース以降でのみ完全に文書化されています。[21]このリリース以前は、Intelの資料でこの命令について言及されているのは散発的でした(例:AP-526 rev 001 )。 [22] AMDプロセッサの場合、この命令は2002年から文書化されています。[23]
INT1ICEBPF1
- ^ ( ) オペコードの動作は、通常のソフトウェア割り込みオペコードの動作とはいくつかの点で異なります。
F1ICEBPCD 01- 保護モードでは、
- 仮想 8086 モードでは、
CD 01アクセス権チェックとして CPL を IOPL に対してチェックしますが、そうではF1ありません。 - VME が有効になっている仮想 8086 モードでは、割り込みリダイレクトは に対してサポートされます
CD 01が、 に対してはサポートされませんF1。
CD 01アクセス権チェックとして CPL を割り込み記述子の DPL フィールドと照合しますが、はF1照合しません。 - 仮想 8086 モードでは、
- ^ UMOV命令は386および486プロセッサにのみ存在します。[20]
- ^ ab 命令
XBTSとIBTS命令は80386のB1ステッピングで廃止されました。
これらは主に80386のバグのある[24]XBTSB0ステッピングの検出のためにソフトウェアで使用されていました。Microsoft Windows(v2.01以降)は、命令が存在しない場合はCPU検出の一環として命令の実行を試み、動作していることが判明したCPUID場合は起動を拒否します。 [25]XBTS - ^ ab およびの場合、r/m引数はビットフィールドを抽出/挿入するデータ、reg引数は挿入/抽出するビットフィールド、AX/EAXはビットオフセット、CLはビットフィールド長を表します。[26]
XBTSIBTS - ^ 文書化されていない、80386のみ。[27]
追加されたもの80486
- ^ 16ビットレジスタの使用自体は禁止されていません(#UDやその他の例外を生成せずに実行されます)が、未定義の結果を生成することが文書化されています。486、 [28] 586、およびBochs / QEMUではさまざまな異なる結果を生成することが報告されています。[29]
BSWAP - ^ ab Intel 80486ステッピングAでは、[30]命令は8ビット版では
CMPXCHG異なるエンコーディングを使用し、 16/32ビット版では異なるエンコーディングを使用する。このエンコーディングは80486ステッピングB以降で使用されている。[31] [32]0F A6 /r0F A7 /r0F B0/B1 - ^ 命令は、最初の引数としてアキュムレータ (AL/AX/EAX/RAX) を使用する命令と同じ方法で
CMPXCHG設定されます。EFLAGSCMP - ^ は
INVLPG、m8 引数が無効な場合 (マップされていないページや非正規のアドレスなど)、何も実行しないものとして実行されます。INVLPG個々のグローバル ページの TLB エントリを無効にするために使用できます。 - ^ ab および命令は、CPU の L1 キャッシュ内のすべてのキャッシュ ラインを無効にします。L2/L3 キャッシュも無効にするかどうかは実装定義です。これらの命令はシリアル化されており、一部のプロセッサでは完了するまで割り込みをブロックすることもあります。
INVDWBINVD
- ^ Intel VT-x仮想化では、この命令は必須の#VMEXITを引き起こします。また、Intel SGXをサポートするプロセッサでは、PRM(プロセッサ予約メモリ)がPRMRR(PRM範囲レジスタ)を使用して設定されている場合、この命令は許可されず、#GP(0)例外を引き起こします。[33]
INVDINVD - ^ プレフィックスがオペコードと共に使用される場合、命令はWBNOINVD 拡張をサポートするプロセッサ上で実行されます。これによりキャッシュが無効になることはありません。
F30F 09WBNOINVD
基本的な 80486 命令セットには存在しなかったが、SSE の導入前にさまざまな x86 プロセッサに追加された整数/システム命令。(廃止された命令は含まれません。)
- ^ IntelおよびAMD CPUでは、この命令はCPUマイクロコードの
WRMSR更新にも使用されます。これは、新しいマイクロコードの仮想アドレスをIntel CPUのMSRに、AMD CPUのMSR [35]にアップロードすることによって行われます。79hC001_0020h - ^ 以下のMSRへの書き込みはシリアル化されません: [36] [37]
- ^ システム管理モードと
RSM命令は、1993 年の Intel Pentium の最初のリリース後にのみ、Intel 486 の非 SL バリアントで利用可能になりました。 - ^ 古い32ビットプロセッサの中には、
CPUIDリーフインデックス(EAX)を0より大きい値にして実行すると、EBXとECXが変更されず、古い値が保持されるものがあります。このため、を実行する前にEBXとECXをゼロにすることをお勧めしますCPUID。
この動作を示すプロセッサには、Cyrix MII [43]やIDT WinChip 2などがあります。 [44]
64ビットモードでは、CPUIDRAX、RBX、RCX、RDXの上位32ビットがゼロに設定されます。 - ^ Ivy Bridge以降の一部のIntelプロセッサには、リング0に制限するために使用できるMSRが存在します。このようなMSRは、少なくともIvy Bridge [45]とDenvertonについて文書化されています。[46]リング0に制限する機能は、「CpuidUserDis」機能をサポートするAMDプロセッサ(Zen 4「Raphael」以降)にも存在します。[47]
CPUIDCPUID - ^ ab
CPUIDは、Intel Pentium の最初のリリース後にリリースされた一部の Intel および AMD 486 プロセッサ バリアントでも使用できます。 - ^ Cyrix 5x86 および 6x86 CPU では、
CPUIDデフォルトでは有効になっていないため、Cyrix 構成レジスタを通じて有効にする必要があります。 - ^ NexGen CPUでは、
CPUIDは一部のシステムBIOSでのみサポートされています。 をサポートする一部のNexGen CPUではCPUID、EFLAGS.IDはサポートされていませんが、EFLAGS.ACはサポートされており、CPU検出が複雑になっています。[48] - ^ 古い
CMPXCHG命令とは異なり、この命令はZF 以外のEFLAGSCMPXCHG8Bビットを変更しません。 - レジスタ オペランド (無効なエンコーディング) を含む^は、一部の Intel Pentium CPU では、予期される #UD 例外ではなくハングを引き起こします。これは、 Pentium F00F バグとして知られています。
LOCK CMPXCHG8B - ^ abc IDT WinChip、Transmeta Crusoe、Rise mP6プロセッサでは、この
CMPXCHG8B命令は常にサポートされていますが、CPUIDビットが欠落している可能性があります。これは、Windows NTのバグを回避するためのものです。[49] - ^ ab および命令は他の命令に対して順序付けされておらず、前の命令が実行される前に、または後の命令が実行された後に、それぞれのカウンタをサンプリングする場合があります。 の呼び出し(ただし は除く)は、同じカウンタの読み取りであっても、互いに順序付けが変更されることがあります。他の命令に対して順序付けを強制するには、または のシリアル化命令(例)が必要です。[50]
RDTSCRDPMCRDPMCRDTSCLFENCECPUID - ^ 固定レートTSCは2段階で導入されました。
- 一定のTSC
- TSCはプロセッサコアがディープスリープ( C2またはそれより深い)モードでない限り固定速度で動作しますが、CPUコア間で同期されません。Intel Prescott、Yonah、Bonnellで導入されました。また、すべてのTransmetaおよびVIA Nano [51] CPUにも存在します。CPUIDビットはありません。
- 不変TSC
- TSCは固定速度で動作し、すべてのP、C、T状態(必ずしもS状態とは限りません)でCPUコア間で同期されたままです。AMD K10以降、Intel Nehalem / Saltwell [52]以降、Zhaoxin WuDaoKou [53]以降
に存在します。CPUIDビット(リーフ)で示されます。8000_0007:EDX[8]
- ^ は
RDTSC、の場合にのみリング0の外部で実行できますCR4.TSD=0。Intel
PentiumおよびAMD K5では、RDTSCVirtual-8086モードでは実行できません。[54]その後のプロセッサではこの制限が削除されました。 - ^ は、
RDPMC次の場合にのみリング 0 の外部で実行できますCR4.PCE=1。 - ^ この
RDPMC命令は Nano より前の VIA プロセッサには存在しません。 - ^ 命令でサポートされている条件コード(オペコード、条件を指定する
xニブル) は次のとおりです。
CMOVcc0F 4x /r - ^ 64 ビット モードでは、
CMOVcc32 ビットのオペランド サイズでは、条件が偽であっても宛先レジスタの上位 32 ビットがクリアされます。メモリ ソース オペランドの
場合CMOVcc、CPU は常にメモリからオペランドを読み取ります。これにより、移動の条件が満たされていなくても、メモリ例外やキャッシュ ライン フィルが発生する可能性があります。(Intel APX拡張機能では、条件が偽の場合にメモリ例外を抑制する、 EVEXでエンコードされた新しいバリアントのセットが定義されていますCMOVcc。) - ^ ネヘミヤ以前のVIA C3変種(「サムエル」/「エズラ」)では、指示の
reg,reg「but not」形式が文書化されていない指示として存在すると報告されている。[55]reg,[mem]CMOVcc - ^ 32/64ビットモードで長さ2~9バイトのマルチバイトNOPに対するIntelの推奨バイトエンコーディングは次のとおりです(16進数):[56]
9 バイトを超える NOP パディングを使用する必要がある場合は、複数の NOP を使用することをお勧めします。
- ^ Pentium Proで追加された他の命令とは異なり、long NOP にはCPUID機能ビットがありません。
- ^
0F 1F /0long-NOPはPentium Proで導入されたが、2006年まで文書化されていなかった。 [58]0F 18..1Fオペコード範囲 全体はNOPPentium Proにあった。しかし、を除いて0F 1F /0、Intelはこれらのオペコードが将来のプロセッサに残ることを保証しておらずNOP、実際にこれらのオペコードの一部を少なくとも一部のプロセッサで他の命令に割り当てている。[59] - ^ 2002年からAMD x86-64について文書化されている。[60]
- ^ このオペコードはPentium以降では無効なオペコードとして正式に予約されていたが、 Pentium Pro以降では
0F 0Bニーモニックが割り当てられるようになった。[62]UD2 - ^ ab GNU Binutilsはバージョン2.7以降、およびオペコードに
UD2Aおよびニーモニックを使用しています。 [63]もも元々は引数を取りませんでしたが、後にBinutilsバージョン2.30でModR/Mバイトを受け入れるように変更されました。[64]UD2B0F 0B0F B9UD2AUD2BUD2B - ^ ( )命令は、投機的であっても、後続のバイトが命令としてデコードされるのを阻止します。このため、間接分岐命令の後にコード以外の何かが続く場合は、間接分岐の後に命令を配置することが推奨されます。[65]
UD20F 0BUD2 - ^ ab UD0/1/2 オペコード -
0F 0B、 -0F B9は、80186以降のすべての x86 プロセッサ ( NEC V シリーズ0F FFプロセッサを除く)で #UD 例外を引き起こしますが、P5 クラス プロセッサまではこの目的のために明示的に予約されていませんでした。 - ^ この
0F B9オペコードはPentium以降、無効なオペコードとして正式に予約されていましたが、ニーモニックが割り当てられたのはUD1ずっと後になってからでした。AMD APMはリビジョン3.17以降からオペコードマップにリストされ始めましたがUD1、[67] Intel SDMはリビジョン061以降からリストされ始めました。[68] - ^ ab とオペコードの両方について、オペコードがModR/Mバイトを受け入れるかどうかに関して、異なるx86実装が異なることが知られています。[69] [70]
0F B90F FF - ^ オペコードについては
0F FF、OIOニーモニックはCyrixによって導入されましたが、[71]ニーモニック(引数なし)は、のニーモニックUD0と同時にAMDとIntelによって導入されました。[67] [68]その後、Intel(AMDではない)のドキュメントでは、の説明が変更され、 ModR/Mバイトが追加され、2つの引数を取るようになりました。[72]UD10F B9UD0 - ^ K6では、
SYSCALL/SYSRET命令はモデル7(250nm「リトルフット」)以降で利用可能でしたが、それ以前のモデル6では利用できませんでした。[74] - ^
SYSCALLそしてSYSRETx86-64 の不可欠な部分になりました。その結果、命令は AMD、Intel、VIA、Zhaoxin のすべての x86-64 プロセッサの 64 ビット モードで使用できます。64
ビット モード以外では、命令は AMD プロセッサでのみ使用できます。 - ^ の正確な意味は
SYSRETAMDとIntelのプロセッサ間で若干異なります。非正規の戻りアドレスはAMD CPUのリング3で#GP例外を引き起こしますが、Intel CPUのリング0では#GP例外を引き起こします。これはセキュリティ上の問題を引き起こすことが知られています。[75] - ^ ab x86-64 の および命令の場合、 64 ビット ユーザー モード コードに戻るバリアントにはプレフィックスを追加する必要があります。プレフィックスのないこれらの命令のエンコードは、32 ビット ユーザー モード コードに戻るために使用されます。(これらの命令はいずれも 16 ビット ユーザー モード コードに戻るために使用できません。)
SYSRETSYSEXITREX.WREX.W - ^ abc 、および命令はリアルモードでは使用できません。(ただし、 は仮想 8086 モードでは使用できます。)
SYSRETSYSENTERSYSEXITSYSENTER - ^ Pentium Proでは、プロセッサが公式にはこれらの命令をサポートしていないにもかかわらず、/のサポートを示すフラグが設定されています。 [76]サードパーティのテストでは、Pentium Proにはオペコードが存在しますが、バグが多すぎて使用できないことが示されています。[77]
CPUIDSYSENTERSYSEXIT
- ^ AMD CPU では、
SYSENTERおよび命令は x86-64ロング モード(#UD)SYSEXITでは使用できません。 - ^ Transmeta CPUでは、命令
SYSENTERとSYSEXIT命令はTransmeta Code Morphingソフトウェアのバージョン4.2以上でのみ利用可能です。[79] - ^ ネヘミアでは、
SYSENTERステップSYSEXIT8以降でのみ利用可能。[80]
命令セット拡張として追加
追加されたもの64ビット
これらの命令は 64 ビット モードでのみエンコードできます。次の 4 つのグループに分類されます。
- 既存のオペコードを別の目的(
MOVSXD置き換えARPL)で再利用するオリジナル命令 - 新しいオペコードを使用した元の命令 (
SWAPGS) - 既存の命令を64ビットのアドレスサイズに拡張(
JRCXZ) - 既存の命令を64ビットのオペランドサイズに拡張(残りの命令)
64 ビットのオペランド サイズを持つほとんどの命令は、REX.Wプレフィックスを使用してこれをエンコードします。プレフィックスがない場合はREX.W、32 ビットのオペランド サイズを持つ対応する命令がエンコードされます。このメカニズムは、32 ビットのオペランド サイズを持つ他のほとんどの命令にも適用されます。これらは、64 ビットのオペランド サイズで使用されても Intel 構文で新しいニーモニックが得られないため、ここには記載されていません。
- ^ メモリオペランドは
CMPXCHG16B16 バイト境界に揃える必要があります。 - ^ この
CMPXCHG16B命令は、初期のIntel/AMD x86-64プロセッサのいくつかには存在しませんでした。Intelプロセッサでは、この命令はXeon "Nocona"ステップDには存在しませんでしたが、[81]ステップEで追加されました。[82] AMD K8ファミリプロセッサでは、DDR2サポートが導入されたのと同時にステップFで追加されました。[83]
このため、にはCMPXCHG16Bx86-64の他の部分とは別に独自のCPUIDフラグがあります。 - ^ REX.Wプレフィックスなしのエンコーディングは
MOVSXD許可されていますが推奨されていません[84]。このようなエンコーディングは16/32ビットMOV(8B /r)と同じように動作します。
ビット操作拡張
ビット操作命令。BMI1 および BMI2 で定義されるすべてのVEX エンコード命令では、オペランド サイズは 32 ビットまたは 64 ビットで、VEX.W ビットによって制御されます。これらの命令はいずれも 16 ビット バリアントでは使用できません。
- ^ AMD CPU では、「ABM」拡張は
POPCNTと の両方を提供しますLZCNT。ただし、Intel CPU では、「ABM」の CPUID ビットはLZCNT命令の存在を示すためだけに文書化されており、「LZCNT」としてリストされていますが、 にはPOPCNT独自の CPUID 機能ビットがあります。
ただし、「ABM」/「LZCNT」拡張を実装する既知のプロセッサはすべて、POPCNTPOPCNT の CPUID 機能ビットも実装して設定するため、この区別は理論上のものにすぎません。 (逆は当てはまりません。Intel NehalemやVIA Nano 3000など、ABM を
サポートしているがサポートしていないプロセッサが存在します。)POPCNT - ^ この命令は、LZCNT または ABM 拡張をサポートしていないシステムで
LZCNTは として実行されます。ソース オペランド内の最も高いセット ビットのインデックスを計算し、ほとんどの入力値に対して とは異なる結果を生成します。BSRBSRLZCNT - ^ この命令は、BMI1 拡張をサポートしていないシステムで
TZCNTは として実行されます。 は、ゼロを除くすべての入力オペランド値に対して と同じ結果を生成します。ゼロの場合は、入力オペランドのサイズを返しますが、未定義の動作を生成します (ほとんどの最新の CPU では宛先は変更されません)。BSFBSFTZCNTTZCNTBSF - ^ の場合
BEXTR、開始位置と長さはマスクされず、0 から 255 までの値を取ることができます。選択されたビットが引数の末尾r/m(通常の 32/64 ビットのオペランド サイズ) を超える場合、超過ビットは 0 として読み出されます。 - ^ Zen 3以前のAMDプロセッサでは、命令
PEXTとPDEP命令は非常に遅く[85]、マイクロコード実装を使用しているためデータ依存のタイミングを示します(マスク引数に設定されたビット数に応じて約18〜300サイクル)。その結果、これらのプロセッサでは他の命令シーケンスを使用する方が高速になることがよくあります。[86] [87]
Intel TSXで追加
追加されたものインテル CET
Intel CET (制御フロー強制テクノロジー) は、リターン指向プログラミングなどのセキュリティ上の脆弱性から保護するために、シャドウ スタック(CET_SS) と間接分岐追跡(CET_IBT) という 2 つの異なる機能を追加します。
- ^ ab および命令は、シャドウ スタックが無効になっているか CET がサポートされていないプロセッサでは NOP として機能します。
RDSSPDRDSSPQ - ^ ab
ENDBR32は、ENDBR64CET_IBT をサポートしていないプロセッサや IBT が無効になっているプロセッサでは NOP として機能します。 - ^ このプレフィックスは、DS:セグメントオーバーライドプレフィックスと同じエンコーディングです。2022年4月現在、Intelのドキュメントでは、このプレフィックスがno-trackプレフィックスとして使用された場合に古いセグメントオーバーライド機能を保持するかどうかは明記されていないようです。また、このプレフィックスの公式ニーモニックも提供されていません。[88] [89] (GNU binutilsは「notrack」を使用します[90] )
XSAVEで追加
XSAVE 命令セット拡張は、CPU 拡張状態 (通常はコンテキスト スイッチングの目的) を保存/復元するように設計されています。この方法は、OS コンテキスト スイッチング コードが新しい拡張の詳細を理解する必要なく、新しい命令セット拡張をカバーするように拡張できます。これは、一連の状態コンポーネントを定義することによって行われます。状態コンポーネントはそれぞれ、特定の保存領域内でサイズとオフセットを持ち、1 つの CPU 拡張または別の CPU 拡張に必要な状態のサブセットに対応します。CPUIDリーフEAX=0Dh は、CPU がサポートする状態コンポーネントとそのサイズ/オフセットに関する情報を提供するために使用され、OS は適切な量のスペースを予約し、関連する有効ビットを設定できます。
- ^ Intel APX では、
XSAVE*命令XRSTOR*を REX2 プレフィックスでエンコードすることはできません。 - ^ XSAVE は Penryn のステッピング E0/R0 で追加され、それ以前のステッピングでは使用できません。
- ^一部のプロセッサ( Skylake、Goldmont、Zen 1以降)では、ECX=1 で実行できます。この場合、(そのようなレジスタは存在しない)は返されず、代わりに「XINUSE」状態コンポーネント ビットマップ(初期状態にあるかどうかが不明な XSAVE 状態コンポーネントのビットマップ)の現在の値とビット単位の AND 演算が行われます。この機能の存在は、CPUID .(EAX=0Dh、ECX=1):EAX[ビット 2]で示されます。
XGETBVXCR1XCR0XGETBV - ^ この命令は、 Intel VT-x
XSETBV仮想化環境で実行されると、必須の #VMEXIT を引き起こします。
他のクロスベンダー拡張機能を追加
- ^ abc Athlon XPより前の AMD Athlonプロセッサは完全なSSEをサポートしていませんでしたが、 「MMX拡張機能」の一部としてSSEの非SIMD命令を導入しました。[91]これらの拡張機能(完全なSSEなし)は、 Geode GX2以降のGeodeプロセッサにも存在します。
- ^ abcdefg すべての
PREFETCH*命令は、プログラムの意味ではなくパフォーマンスにのみ影響するヒント命令です。無効なアドレス (マップされていないページのアドレスや非標準アドレスなど) を指定すると、命令は例外を生成せずに NOP として動作します。 - ^ abc 、および命令の場合、ModR/M バイトの下位 3 ビットは無視され、0..7 の範囲内の x の値はいずれも有効な命令になります。
SFENCELFENCEMFENCE - ^ 命令は、命令
SFENCEの後のすべてのメモリストアが、SFENCEの前のすべてのメモリストアの後にグローバルに観測可能になることを保証しSFENCEます。これにより、非一時的ストアや WC (Write-Combining) メモリ領域へのストアなど、他の方法では順序変更可能なストアに順序付けが強制されます。[92]
Intel CPU および Zen1 以降の AMD CPU (古い AMD CPU は除く) では、は、、および命令で実行SFENCEされるキャッシュフラッシュ/ライトバックに対する順序変更バリアとしても機能します。(古い AMD CPU ではを順序付けする必要があります。)は に関して順序付けされておらず、シーケンスでは、ロードが前のストアを過ぎて順序変更されるのを防ぐのに十分ではありません。[93]このような順序変更を防ぐには、、またはシリアル化命令を実行する必要があります。CLFLUSHCLFLUSHOPTCLWBMFENCECLFLUSHSFENCELFENCESFENCE+LFENCEMFENCELOCK - ^ 命令は、命令
LFENCEより後のすべてのメモリロードが、命令より前のすべてのメモリロードの後にグローバルに観測可能になることを保証します。SSE2LFENCEをサポートするすべての Intel CPU では、命令はより強力な順序保証を提供します: [94]これはディスパッチシリアル化であり、命令より後の命令は、命令より前のすべての命令がリタイアした後にのみ実行を開始できます (これにより、すべての先行するロードが完了していることが保証されますが、ストアは必ずしも完了しているとは限りません)。ディスパッチシリアル化の効果は、パフォーマンスカウンター (egまたはを介してアクセス) やx2apic MSRなどの非メモリ リソースへのアクセスに対する投機バリアおよび並べ替えバリアとしても機能することです。AMD CPU では、必ずしもデフォルトでディスパッチシリアル化されるわけではありませんが、非ディスパッチシリアル化 をサポートするすべての AMD CPU では、 MSR のビット 1 を設定することでディスパッチシリアル化にすることができます。[95]LFENCELFENCELFENCELFENCERDTSCRDPMCLFENCELFENCEC001_1029 - ^ 命令は、命令
MFENCEの後のすべてのメモリロード、ストア、キャッシュラインフラッシュが、命令の前のすべてのメモリロード、ストア、キャッシュラインフラッシュの後にグローバルに観測可能になることを保証します。Intel CPUMFENCEでは、はディスパッチシリアル化されないため、パフォーマンスカウンタや x2apic MSR などの非メモリリソースへのアクセスの順序付けを強制するために単独で使用することはできません。は依然として に関して順序付けされているため、メモリストアと後続の非メモリアクセスの間で順序付けを強制する必要がある場合は、に続いてを発行することでそのような順序付けを取得できます。[50] [96] AMD CPU では、はシリアル化されます。MFENCEMFENCEMFENCELFENCEMFENCELFENCEMFENCE - ^ 64 ビット モードでの命令の動作は、とは異なり、プレフィックスの存在によって影響を受けません。 も も、プレフィックスの他のビットの影響を受けません。 64 ビット モードでオペコードがさまざまなプレフィックスとどのように相互作用するかの例をいくつか示します。
PAUSENOPREX.RNOPPAUSEREX9090はNOP41 90はXCHG R8D,EAX4E 90はNOP49 90はXCHG R8,RAXF3 90はPAUSEF3 41 90はPAUSEF3 4F 90はPAUSE
- ^ 命令によって実行される一時停止の実際の長さは
PAUSE実装に依存します。SSE2
のないシステムでは、PAUSENOP として実行されます。 - ^ VT-x または AMD-V 仮想化では、
PAUSE短い時間間隔で何度も実行すると #VMEXIT が発生する可能性があります。PAUSE#VMEXIT をトリガーできる実行回数と間隔の長さはプラットフォームによって異なります。 - ^ この
CLFLUSH命令は SSE2 とともに導入されましたが、独自の CPUID フラグがあり、SSE2 を実装していないプロセッサに存在する場合や、SSE2 を実装しているプロセッサに存在しない場合があります。(例: AMD Geode LX はSSE2 をサポートしていますCLFLUSHが、サポートしていません。) - ^ および命令は SSE3 と同時に導入されましたが、独自の CPUID フラグがあり、SSE3 CPUID フラグとは別にチェックする必要があります (例: Athlon 64 X2およびVIA C7 はSSE3 をサポートしていますが、MONITOR はサポートしていません)。
MONITORMWAIT - ^ ab および命令については、古いIntelのドキュメント[97]では明示的なオペランド(および)を持つ命令ニーモニックが記載されているが、新しいドキュメントではこれらのオペランドは省略されている。アセンブラ/逆アセンブラは、これらのバリアントの1つまたは両方をサポートする場合がある。[98]
MONITORMWAITMONITOR EAX,ECX,EDXMWAIT EAX,ECX - ^ の場合
MONITOR、DS: セグメントはセグメント プレフィックスで上書きできます。
監視されるメモリ領域は、DS:rAX で指定された 1 バイトだけではなく、そのバイトを含む線形メモリ領域になります。このメモリ領域のサイズとアラインメントは実装に依存し、CPUID を通じて照会できます。監視する
メモリ位置のメモリ タイプは WB (ライトバック キャッシュ可能) である必要があります。そうでない場合、監視が失敗する可能性があります。 - ^ 2024 年 4 月現在、この
MONITOR命令には拡張機能やヒントは定義されていません。そのため、この命令では ECX=0 が必要であり、EDX は無視されます。 - ^ Intel Xeon Phi x200 [99]やAMD K10 [100]以降などの一部のプロセッサでは、リング3を有効にして実行するために使用できるMSRが文書化されています。
MONITORMWAIT - ^ によって実行される待機は、
MWAITメモリ書き込み以外のシステム イベント (キャッシュラインの削除、割り込みなど) によって終了する場合があります。待機を終了させるイベントの正確なセットは実装によって異なります。待機がメモリ書き込みによって終了したか、その他のイベントによって終了したかに関係なく、監視は終了しており、再度メモリ書き込みを待機する前に を使用して
監視を再度設定する必要があります。MONITORMWAIT - ^ ECX レジスタで
使用可能な拡張フラグは次のとおりです。
MWAIT - ^ EAX レジスタで
使用可能なヒント フラグは次のとおりです。
MWAITC ステートはプロセッサ固有の電源状態であり、必ずしもACPI C ステートに 1:1 で対応するわけではありません。
- ^ 命令の場合
GETSEC、REX.Wプレフィックスは EXITAC リーフ機能に対してのみ 64 ビット アドレスを有効にします。それ以外の場合、REX プレフィックスは許可されますが、命令では無視されます。 - ^ (EAX によって選択される)
に定義されているリーフ関数は次のとおりです。
GETSECEAX でサポートされていない値を指定すると、#UD 例外が発生します。
- ^ の場合
GETSEC、ほとんどのリーフ関数はリング 0 に制限されていますが、CAPABILITIES (EAX=0) および PARAMETERS (EAX=6) リーフ関数はリング 3 でも使用できます。 - ^ ab および によって読み取られる「コア ID」値は
RDTSCP、実際にはMSR (MSR )RDPIDです。この値が実際にプロセッサ ID に対応するかどうかは、オペレーティング システムの規則の問題です。TSC_AUXC000_0103h - ^ 古い
RDTSC命令とは異なり、RDTSCP以前のすべての命令が終了されるまで TSC の読み取りを遅延し、先行するメモリのロード (ストアではない) に関する順序付けを保証します。RDTSCPただし、後続の命令に関しては順序付けされません。 - ^ は、
RDTSCP次の場合にのみリング 0 の外部で実行できますCR4.TSD=0。 - ^ の サポートは
RDTSCPAMD K8 のステッピング F で追加されましたが、それ以前のステッピングでは利用できません。 - ^ この
POPCNT命令は SSE4.2 と同時に導入されましたが、SSE4.2 の一部とはみなされておらず、独自の CPUID フラグを持つ別の拡張機能です。AMD
プロセッサでは、ABM 拡張機能の一部と見なされますが、独自の CPUID フラグを持ちます。 - ^ に定義されている無効化タイプ
INVPCID(レジスタ引数によって選択)は次のとおりです。レジスタ引数にサポートされていない値があると、#GP 例外が発生します。
- ^ 古い
INVLPG命令とは異なり、INVPCID指定されたメモリアドレスが非標準の場合、#GP例外が発生します。この矛盾はセキュリティ上の問題を引き起こすことが知られています。[104] - ^ および命令は3DNow!命令セット拡張の必須部分ですが、3DNow! をサポートしていないシステムではスタンドアロン拡張としても利用できます。
PREFETCHPREFETCHW - ^ および( )のオペコードは、Cedar Mill (65nm Pentium 4 ) 以降の Intel CPU では NOP として実行され、Broadwell 以降ではプリフェッチ機能が追加されました。
PREFETCHPREFETCHW0F 0D /rPREFETCHW - ^ ( ) 命令は3DNow !命令であり、3DNow! を持つすべてのプロセッサに存在しますが、PREFETCHW 拡張を持つプロセッサに必ずしも存在するわけではありません。PREFETCHWを持つ AMD CPU では、オペコードとオペコードはすべてプリフェッチを実行すると文書化されています。PREFETCHWを持つ Intel プロセッサでは、これらのオペコードは予約 NOP [105]を実行すると文書化されています( Xeon Phiのみを除く)。サードパーティのテスト[106]によると、これらのオペコードの一部またはすべてが少なくとも一部の Intel Core CPU でプリフェッチを実行している可能性があります。
PREFETCH0F 0D /00F 0D /00F 0D /2../70F 0D /2PREFETCHWT1 m8 - ^ abc SMAP、PKU、RDPID命令セット拡張は、Zhaoxin LuJiaZuiのステップ2 [107] 以降ではサポートされていますが、それ以前のステップではサポートされていません。
- ^ プロセッサ ID の読み取りにも使用できる古い命令とは異なり、ユーザー モードはによって無効にされません。
RDTSCPRDPIDCR4.TSD=1 - ^ の場合
MOVDIR64、ES:reg で指定される宛先アドレスは 64 バイト境界に揃っている必要があります。
レジスタ引数のオペランド サイズはアドレス サイズによって指定され、67hプレフィックスによって上書きされる場合があります。64
バイトのメモリ ソース引数は 64 バイト境界に揃っている必要はなく、アトミックに読み取られる保証はありません。 - ^ 命令は、WBNOINVD 拡張をサポートしていないシステムで実行される場合と
WBNOINVD同じように実行されます。 は、ライトバック後にすべてのキャッシュ ラインを無効にする点が異なります。WBINVDWBINVDWBNOINVDWBINVD - ^ ab 初期の実装では、命令
PREFETCHIT0とPREFETCHIT1命令は、RIP 相対アドレッシング モードを使用する場合にのみコード プリフェッチを実行し、それ以外の場合は NOP として動作します。PREFETCHI
命令はヒント命令のみです。無効なアドレスをプリフェッチしようとすると、命令は例外を生成せずに NOP として動作します。Long-NOP をサポートしていても PREFETCHI 命令をサポートしていないプロセッサでは、これらの命令は常に NOP として動作します。
その他のIntel固有の拡張機能を追加
- ^ ab 分岐ヒントのニーモニックは
HWNT、初期のウィラメットのドキュメントHSTにのみ記載されています[108]。その後のIntelのドキュメントでは、分岐ヒントのプレフィックスはニーモニックを割り当てずにリストされています。[109]Intel XEDはこれらの分岐ヒントにニーモニック
hint-takenとを使用します。 [110]hint-not-taken - ^ ab およびプレフィックスは、条件分岐命令 (オペコードおよび)で使用される場合にのみ分岐ヒントとして解釈されます。他のオペコードで使用される場合は、別の意味を持つ場合があります (たとえば、64 ビット モード外のメモリ オペランドを持つ命令の場合、それぞれセグメント オーバーライド プレフィックスおよびとして機能します)。分岐ヒントをサポートしないプロセッサでは、これらのプレフィックスは受け入れられますが、 で使用される場合は無視されます。
2E3EJcc70..7F0F 80..8FCS:DS:Jcc - ^ 分岐ヒントはすべてのNetBurst (Pentium 4 ファミリ) プロセッサでサポートされていますが、2023 年の「Meteor Lake」以降の「Redwood Cove」CPU で再導入されるまでは、他の既知のプロセッサではサポートされていません。
- ^ (EAX によって選択される)
に定義されているリーフ関数は次のとおりです。
ENCLSEAX でサポートされていない値を指定すると、#GP 例外が発生します。
- ^ SGXは第11世代(Rocket Lake、Tiger Lake )以降のデスクトップ/ラップトッププロセッサでは非推奨となっていますが、 Xeonブランドのサーバー部品では引き続き利用可能です。[114]
- ^ (EAX によって選択される)
に定義されているリーフ関数は次のとおりです。
ENCLUEAX にサポートされていない値があると、#GP 例外が発生します。EENTER
関数と ERESUME 関数は SGX エンクレーブ内では実行できません。その他の関数はエンクレーブ内でのみ実行できます。 - ^ は
ENCLUリング 3 でのみ実行でき、リング 0/1/2 では実行できません。 - ^ (EAX によって選択される)
に定義されているリーフ関数は次のとおりです。
ENCLVEAX にサポートされていない値があると、#GP 例外が発生します。
このENCLV命令は、SGX に対する EPC オーバーサブスクリプション拡張 ("OVERSUB") をサポートするシステムにのみ存在します。 - ^
ENCLVは、Intel VMX 操作が で有効になっている場合にのみ使用可能でVMXON、それ以外の場合は #UD が生成されます。 - ^ の場合
PTWRITE、プロセッサ トレース パケットへの書き込みは、一連の有効ビット (RTIT_STATUSMSR の「TriggerEn」、「ContextEn」、「FilterEn」ビット、および MSR の「PTWEn」ビットRTIT_CTL) がすべて 1 に設定されている場合にのみ行われます。
命令PTWRITEは、他のプレフィックスに関係なく、66h 命令プレフィックスが使用されている場合に #UD 例外を引き起こすように SDM で示されます。 - ^ (EAX によって選択される)
に定義されているリーフ関数は次のとおりです。
PCONFIGEAX でサポートされていない値を指定すると、#GP(0) 例外が発生します。
- ^ の場合
CLDEMOTE、キャッシュ ラインを降格するキャッシュ レベルは実装に依存します。
命令はヒントと見なされるため、指定されたメモリ アドレスが無効であるか、L1 キャッシュにない場合は、例外なしで NOP として実行されます。実装に依存するその他の状況でも、NOP として実行される可能性があります。CLDEMOTE
拡張をサポートしていないシステムでは、NOP として実行されます。 - ^ Intelのドキュメントでは、CLDEMOTEが導入されたプロセッサとしてTremontとAlder Lakeを挙げている。しかし、2022年5月現在、CLDEMOTEのCPUID機能ビットが設定されているTremontやAlder Lakeのモデルは確認されておらず、CPUIDビットがクリアされているものもいくつかある。[117]
2023年4月現在、CLDEMOTEのCPUID機能ビットがSapphire Rapidsに設定されていることが確認されている。[118] - ^ の場合
UMONITOR、アドレス引数のオペランド サイズはアドレス サイズによって指定されますが、67hプレフィックスによって上書きされる場合があります。使用されるデフォルトのセグメントは DS: ですが、セグメント プレフィックスによって上書きできます。 - ^ ab および命令の場合、オペレーティング システムは MSR を使用して、単一の/呼び出しが待機できる最大時間を制限できます。および命令は、 で定義された時間制限に達した場合は 1 に設定され、それ以外の場合は 0に設定されます。
UMWAITTPAUSEIA32_UMWAIT_CONTROLUMWAITTPAUSEUMWAITTPAUSERFLAGS.CFIA32_UMWAIT_CONTROL - ^
TPAUSEであり、UMWAITの場合にのみリング 0 の外部で実行できますCR4.TSD=0。 - ^ および命令のレジスタ引数では、次のフラグ ビットがサポートされています。
UMWAITTPAUSE - ^ シリアル化は、たとえばや
CPUIDなどの古い命令でも実行できますがIRET、これらの命令は追加の機能を実行するため、スタンドアロン命令のシリアル化が必要な場合に副作用が発生し、パフォーマンスが低下します。 (CPUIDにはさらに、仮想化環境で実行すると必須の #VMEXIT が発生し、非常に大きなオーバーヘッドが発生するという問題があります。)SERIALIZE命令はシリアル化のみを実行し、これらの追加コストを回避します。 - ^ リセットできる CPU 履歴コンポーネントのビットマップは、CPUID.(EAX=20h,ECX=0):EBX
HRESETによって提供されます。2023年 7 月現在、次のビットが定義されています。
- ^ の レジスタ引数は、 UITT (ユーザー割り込みターゲット テーブル、新しいおよびMSRによって指定されるテーブル)
SENDUIPIからエントリを選択するためのインデックスです。UINTR_TTUINT_MISC - ^ Sapphire Rapidsプロセッサでは、命令は常に UIF (ユーザー割り込みフラグ) を 1 に設定します。Sierra Forest以降のプロセッサでは、UIF を RFLAGS のスタックからポップされた値のビット 1 の値に設定します。この機能は で示されます。
UIRETUIRETCPUID.(EAX=7,ECX=1):EDX[17] - ^ およびの場合、レジスタ引数のオペランド サイズは現在のアドレス サイズによって指定され、プレフィックスで上書きできます。
ENQCMDEMQCMDS67h - ^ ab および命令の場合、RSI レジスタと RDI レジスタで指定されるアドレスは 8 バイト境界に揃っている必要があります。
RDMSRLISTWRMSRLIST - ^ 命令でサポートされている条件コード(条件を指定する
xニブルを含むオペコード) は次のとおりです。
CMPccXADDVEX.128.66.0F38 Ex /r - ^ 命令はロックされたメモリ操作を実行しますが、 ( ) プレフィックスは不要であり、受け入れることもありません。このプレフィックスを使用しようとすると、#UD が返されます。
CMPccXADDLOCKF0h
その他のAMD固有の拡張機能を追加
- ^ CR8 レジスタにアクセスする標準的な方法は、プレフィックス( )を使用するエンコードを使用することです。ただし、プレフィックスは 64 ビット モードでのみ使用できます。AltMovCr8拡張機能は、の代わりに( ) プレフィックスを使用して CR8 にアクセスするための追加の方法を追加します。これにより、64 ビット モード以外で CR8 にアクセスできます。
REX.R44 0F 20 07MOV RDI,CR8REX.RF0LOCKREX.R - ^ ab CRx レジスタとの間の MOV の他のバリエーションと同様に、AltMovCr8 エンコーディングは命令の ModR/M バイトの上位 2 ビットを無視し、常にこれら 2 ビットが に設定されているかのように実行します
11b。AltMovCr8
エンコーディングは 64 ビット モードで使用できます。ただし、LOCKプレフィックスとREX.Rプレフィックスを組み合わせることは許可されておらず、#UD 例外が発生します。 - ^ AltMovCR8 のサポートは AMD K8 のステッピング F で追加され、それ以前のステッピングでは使用できません。
- ^ の場合
CLZERO、アドレスサイズと67hプレフィックスは、アドレスとしてAX、EAX、RAXのどれを使用するかを制御します。デフォルトのセグメントDS:は、セグメントオーバーライドプレフィックスでオーバーライドできます。指定されたアドレスは整列されている必要はありません。ハードウェアが必要に応じて整列します。
このCLZERO命令は、致命的なマシンチェックエラーからの回復を目的としています。キャッシュ不可能であり、メモリアクセスなしでキャッシュラインを割り当てるために使用することはできず、高速メモリクリアには使用しないでください。[120] - ^ で使用されるレジスタ番号は、/
RDPRUの番号と必ずしも一致しません。2022年 12 月現在、 でサポートされているレジスタは次のとおりです。RDMSRWRMSRRDPRUECX でサポートされていない値は 0 を返します。
- ^ の場合
CR4.TSD=1、RDPRU命令はリング 0 でのみ実行できます。
x87 浮動小数点命令
x87コプロセッサが存在する場合、浮動小数点演算をサポートします。コプロセッサは 8 つのデータ レジスタを提供し、各レジスタは 1 つの 80 ビット浮動小数点値 (1 つの符号ビット、15 の指数ビット、64 の仮数ビット) を保持します。これらのレジスタはスタックとして構成され、スタックの先頭のレジスタは「st」または「st(0)」と呼ばれ、その他のレジスタは st(1)、st(2)、...st(7) と呼ばれます。さらに、"PC" (精度制御、浮動小数点演算を 24、53、または 64 の仮数ビットに丸めるかどうかを制御) や "RC" (丸め制御、丸めモードの選択: ゼロへの丸め、正の無限大への丸め、負の無限大への丸め、最も近い偶数への丸め)、および 4 ビットの条件コード レジスタ "CC" (4 ビットはそれぞれ C0、C1、C2、および C3 と呼ばれます) など、多数の制御レジスタとステータス レジスタも提供します。x87 によって提供されるすべての算術命令が PC と RC に従うわけではありません。
オリジナル8087説明書
- ^ x87 coprocessors (other than the 8087) handle exceptions in a fairly unusual way. When an x87 instruction generates an unmasked arithmetic exception, it will still complete without causing a CPU fault – instead of causing a fault, it will record within the coprocessor information needed to handle the exception (instruction pointer, opcode, data pointer if the instruction had a memory operand) and set FPU status-word flag to indicate that a pending exception is present. This pending exception will then cause a CPU fault when the next x87, MMX or
WAITinstruction is executed.
The exception to this is x87's "Non-Waiting" instructions, which will execute without causing such a fault even if a pending exception is present (with some caveats, see application note AP-578[121]). These instructions are mostly control instructions that can inspect and/or modify the pending-exception state of the x87 FPU. - ^ For each non-waiting x87 instruction whose mnemonic begins with
FN, there exists a pseudo-instruction that has the same mnemonic except without the N. These pseudo-instructions consist of aWAITinstruction (opcode9B) followed by the corresponding non-waiting x87 instruction. For example:FNCLEXis an instruction with the opcodeDB E2. The corresponding pseudo-instructionFCLEXis then encoded as9B DB E2.FNSAVE ES:[BX+6]is an instruction with the opcode26 DD 77 06. The corresponding pseudo-instructionFSAVE ES:[BX+6]is then encoded as9B 26 DD 77 06
- ^ a b c d On 80387 and later x87 FPUs,
FLDENV,F(N)STENV,FRSTORandF(N)SAVEexist in 16-bit and 32-bit variants. The 16-bit variants will load/store a 14-byte floating-point environment data structure to/from memory – the 32-bit variants will load/store a 28-byte data structure instead. (F(N)SAVE/FRSTORwill additionally load/store an additional 80 bytes of FPU data register content after the FPU environment, for a total of 94 or 108 bytes). The choice between the 16-bit and 32-bit variants is based on theCS.Dbit and the presence of the66hinstruction prefix. On 8087 and 80287, only the 16-bit variants are available.
64-bit variants of these instructions do not exist – usingREX.Wunder x86-64 will cause the 32-bit variants to be used. Since these can only load/store the bottom 32 bits of FIP and FDP, it is recommended to useFXSAVE64/FXRSTOR64instead if 64-bit operation is desired. - ^ a b In the case of an x87 instruction producing an unmasked FPU exception, the 8087 FPU will signal an IRQ some indeterminate time after the instruction was issued. This may not always be possible to handle,[122] and so the FPU offers the
F(N)DISIandF(N)ENIinstructions to set/clear the Interrupt Mask bit (bit 7) of the x87 Control Word,[123] to control the interrupt.
Later x87 FPUs, from 80287 onwards, changed the FPU exception mechanism to instead produce a CPU exception on the next x87 instruction. This made the Interrupt Mask bit unnecessary, so it was removed.[124] In later Intel x87 FPUs, theF(N)ENIandF(N)DISIinstructions were kept for backwards compatibility, executing as NOPs that do not modify any x87 state. - ^ a b c
FST/FSTPwith an 80-bit destination (m80 or st(i)) and an sNaN source value will produce exceptions on AMD but not Intel FPUs. - ^
FSTP ST(0)is a commonly used idiom for popping a single register off the x87 register stack. - ^ a b c d e f g h i Intel x87 alias opcode. Use of this opcode is not recommended.
On the Intel 8087 coprocessor, several reserved opcodes would perform operations behaving similarly to existing defined x87 instructions. These opcodes were documented for the 8087[125] and 80287,[126] but then omitted from later manuals until the October 2017 update of the Intel SDM.[127]
They are present on all known Intel x87 FPUs but unavailable on some older non-Intel FPUs, such as AMD Geode GX/LX, DM&P Vortex86[128] and NexGen 586PF.[129] - ^ a b On the 8087 and 80287,
FBSTPand the load-constant instructions always use the round-to-nearest rounding mode. On the 80387 and later x87 FPUs, these instructions will use the rounding mode specified in the x87 RC register. - ^ a b c d e f g h i For the
FADDP,FSUBP,FSUBRP,FMULP,FDIVP,FDIVRP,FCOM,FCOMPandFXCHinstructions, x86 assemblers/disassemblers may recognize variants of the instructions with no arguments. Such variants are equivalent to variants using st(1) as their first argument. - ^ On Intel Pentium and later processors,
FXCHis implemented as a register renaming rather than a true data move. This has no semantic effect, but enables zero-cycle-latency operation. It also allows the instruction to break data dependencies for the x87 top-of-stack value, improving attainable performance for code optimized for these processors. - ^ The result of executing the
FBLDinstruction on non-BCD data is undefined. - ^ On early Intel Pentium processors, floating-point divide was subject to the Pentium FDIV bug. This also affected instructions that perform divide as part of their operations, such as
FPREMandFPATAN.[130] - ^ The
FXAMinstruction will set C0, C2 and C3 based on value type in st(0) as follows:C1 is set to the sign-bit of st(0), regardless of whether st(0) is Empty or not.
- ^ For
FXTRACT, if st(0) is zero or ±∞, then M is set equal to st(0). If st(0) is zero, E is set to 0 on 8087/80287 but -∞ on 80387 and later. If st(0) is ±∞, then E is set to +∞. - ^ For
FPREM, if the quotient Q is larger than , then the remainder calculation may have been done only partially – in this case, theFPREMinstruction will need to be run again in order to complete the remainder calculation. This is indicated by the instruction settingC2to 1.
If the instruction did complete the remainder calculation, it will setC2to 0 and set the three bits{C0,C3,C1}to the bottom three bits of the quotient Q.
On 80387 and later, if the instruction didn't complete the remainder calculation, then the computed remainder Q used for argument reduction will have been rounded to a multiple of 8 (or larger power-of-2), so that the bottom 3 bits of the quotient can still be correctly retrieved in a later pass that does complete the remainder calculation. - ^ The remainder computation done by the
FPREMinstruction is always exact with no roundoff errors. - ^ For the
FSCALEinstruction on 8087 and 80287, st(1) is required to be in the range . Also, its absolute value must be either 0 or at least 1. If these requirements are not satisfied, the result is undefined.
These restrictions were removed in the 80387. - ^ For
FSCALE, rounding is only applied in the case of overflow, underflow or subnormal result. - ^ The x87 transcendental instructions do not obey PC or RC, but instead compute full 80-bit results. These results are not necessarily correctly rounded (see Table-maker's dilemma) – they may have an error of up to ±1 ulp on Pentium or later, or up to ±1.5 ulps on earlier x87 coprocessors.
- ^ a b For the
FYL2XandFYL2XP1instructions, the maximum error bound of ±1 ulp only holds for st(1)=1.0 – for other values of st(1), the error bound is increased to ±1.35 ulps. - ^ For
FPATAN, the following adjustments are done as compared to just computing a one-argument arctangent of the ratio :- If both st(0) and st(1) are ±∞, then the arctangent is computed as if each of st(0) and st(1) had been replaced with ±1 of the same sign. This produces a result that is an odd multiple of .
- If both st(0) and st(1) are ±0, then the arctangent is computed as if st(0) but not st(1) had been replaced with ±1 of the same sign, producing a result of ±0 or .
- If st(0) is negative (has sign bit set), then an addend of with the same sign as st(1) is added to the result.
- ^ While
FNOPis a no-op in the sense that will leave the x87 FPU register stack unmodified, it may still modify FIP and CC, and it may fault if a pending x87 FPU exception is present.
x87 instructions added in later processors
- ^ The x87 FPU needs to know whether it is operating in Real Mode or Protected Mode because the floating-point environment accessed by the
F(N)SAVE,FRSTOR,FLDENVandF(N)STENVinstructions has different formats in Real Mode and Protected Mode. On 80287, theF(N)SETPMinstruction is required to communicate the real-to-protected mode transition to the FPU. On 80387 and later x87 FPUs, real↔protected mode transitions are communicated automatically to the FPU without the need for any dedicated instructions – therefore, on these FPUs,FNSETPMexecutes as a NOP that does not modify any FPU state. - ^ Not including discontinued instructions specific to particular 80387-compatible FPU models.
- ^ a b For the
FUCOMandFUCOMPinstructions, x86 assemblers/disassemblers may recognize variants of the instructions with no arguments. Such variants are equivalent to variants using st(1) as their first argument. - ^ The 80387
FPREM1instruction differs from the olderFPREM(D9 F8) instruction in that the quotient Q is rounded to integer with round-to-nearest-even rounding rather than the round-to-zero rounding used byFPREM. LikeFPREM,FPREM1always computes an exact result with no roundoff errors. LikeFPREM, it may also perform a partial computation if the quotient is too large, in which case it must be run again. - ^ a b c Due to the x87 FPU performing argument reduction for sin/cos with only about 68 bits of precision, the value of k used in the calculation of
FSIN,FCOSandFSINCOSis not precisely 1.0, but instead given by[131][132]This argument reduction inaccuracy also affects theFPTANinstruction. - ^ The
FCOMI,FCOMIP,FUCOMIandFUCOMIPinstructions write their results to theZF,CFandPFbits of theEFLAGSregister. On Intel but not AMD processors, theSF,AFandOFbits ofEFLAGSare also zeroed out by these instructions. - ^ The
FXSAVEandFXRSTORinstructions were added in the "Deschutes" revision of Pentium II, and are not present in earlier "Klamath" revision.
They are also present in AMD K7.
They are also considered an integral part of SSE and are therefore present in all processors with SSE. - ^ a b The
FXSAVEandFXRSTORinstructions will save/restore SSE state only on processors that support SSE. Otherwise, they will only save/restore x87 and MMX state.
The x87 section of the state saved/restored byFXSAVE/FXRSTORhas a completely different layout than the data structure of the olderF(N)SAVE/FRSTORinstructions, enabling faster save/restore by avoiding misaligned loads and stores. - ^ a b When floating-point emulation is enabled with
CR0.EM=1,FXSAVE(64)andFXRSTOR(64)are considered to be x87 instructions and will accordingly produce an #NM (device-not-available) exception. Other thanWAIT, these are the only opcodes outside theD8..DFESC opcode space that exhibit this behavior. (All opcodes inD8..DFwill produce #NM ifCR0.EM=1, even for undefined opcodes that would produce #UD otherwise.) - ^ Unlike the older
F(N)SAVEinstruction,FXSAVEwill not initialize the FPU after saving its state to memory, but instead leave the x87 coprocessor state unmodified.
SIMD instructions
Cryptographic instructions
Virtualization instructions
Other instructions
x86 also includes discontinued instruction sets which are no longer supported by Intel and AMD, and undocumented instructions which execute but are not officially documented.
Undocumented x86 instructions
The x86 CPUs contain undocumented instructions which are implemented on the chips but not listed in some official documents. They can be found in various sources across the Internet, such as Ralf Brown's Interrupt List and at sandpile.org
Some of these instructions are widely available across many/most x86 CPUs, while others are specific to a narrow range of CPUs.
Undocumented instructions that are widely available across many x86 CPUs include
Undocumented instructions that appear only in a limited subset of x86 CPUs include
Undocumented x87 instructions
See also
- CLMUL
- RDRAND
- Advanced Vector Extensions 2
- AVX-512
- x86 Bit manipulation instruction set
- CPUID
- List of discontinued x86 instructions
References
- ^ "Re: Intel Processor Identification and the CPUID Instruction". Retrieved 2013-04-21.
- ^ "Intel 80x86 Instruction Set Summary" (PDF). eecs.wsu.edu.
- ^ Michal Necasek, SGDT/SIDT Fiction and Reality, 4 May 2017. Archived on 29 Nov 2023.
- ^ a b Intel, Undocumented iAPX 286 Test Instruction. Archived on 20 Dec 2023.
- ^ WikiChip, UMIP – x86. Archived on 16 Mar 2023.
- ^ Oracle Corp, Oracle® VM VirtualBox Administrator's Guide for Release 6.0, section 3.5: Details About Software Virtualization. Archived on 8 Dec 2023.
- ^ MBC Project, Virtual Machine Detection (permanent link) or Virtual Machine Detection (non permanent link)
- ^ Andrew Schulman, "Unauthorized Windows 95" (ISBN 1-56884-169-8), chapter 8, p.249,257.
- ^ US Patent 4974159, "Method of transferring control in a multitasking computer system" mentions 63h/ARPL.
- ^ Intel, Pentium® Processor Family Developer’s Manual, Volume 3, 1995, order no. 241430-004, section 12.7, p. 323
- ^ Intel, How Microarchitectural Data Sampling works, see mitigations section. Archived on Apr 22,2022
- ^ Linux kernel documentation, Microarchitectural Data Sampling (MDS) mitigation Archived 2020-10-21 at the Wayback Machine
- ^ VCF Forums, I found the SAVEALL opcode, jun 21, 2019. Archived on 13 Apr 2023.
- ^ rep lodsb, Intel 286 secrets: ICE mode and F1 0F 04, aug 12, 2022. Archived on 8 Dec 2023.
- ^ LKML, (PATCH) x86-64, espfix: Don't leak bits 31:16 of %esp returning to 16-bit stack, Apr 29, 2014. Archived on Jan 4, 2018
- ^ Raymond Chen, Getting MS-DOS games to run on Windows 95: Working around the iretd problem, Apr 4, 2016. Archived on Mar 15, 2019
- ^ sandpile.org, x86 architecture rFLAGS register, see note #7. Archived on 3 Nov 2011.
- ^ iPXE, Commit bc35b24: Fix use of writable code segment on 486 and earlier CPUs, Github, Feb 2, 2022 − indicates that when leaving protected mode on 386/486 by writing to
CR0, it is specifically necessary to do a farJMP(opcodeEA) in order to restore proper real-mode access-rights for the CS segment, and that other far control transfers (e.g.RETF,IRET) will not do this. Archived on 4 Nov 2024. - ^ Can Bölük, Speculating the entire x86-64 Instruction Set In Seconds with This One Weird Trick, Mar 22, 2021. Archived on Mar 23, 2021.
- ^ a b Robert Collins, Undocumented OpCodes, 29 july 1995. Archived on 21 feb 2001
- ^ Michal Necasek, ICEBP finally documented, OS/2 Museum, May 25, 2018. Archived on 6 June 2018
- ^ Intel, AP-526: Optimization For Intel's 32-bit Processors, order no. 242816-001, october 1995 – lists
SALCon page 83,INT1on page 86 andFFREEPon page 114. Archived from the original on 22 Dec 1996. - ^ AMD, AMD 64-bit Technology, vol 2: System Programming, order no. 24593, rev 3.06, aug 2002, page 248
- ^ "Intel 80386 CPU Information | PCjs Machines". www.pcjs.org.
- ^ Geoff Chappell, CPU Identification before CPUID, 27 Jan 2020. Archived on 7 Apr 2023.
- ^ Jeff Parsons, Obsolete 80386 Instructions: IBTS and XBTS, PCjs Machines. Archived on Sep 19, 2020.
- ^ Robert Collins, The LOADALL Instruction. Archived from the original on Jun 5, 1997.
- ^ Toth, Ervin (1998-03-16). "BSWAP with 16-bit registers". Archived from the original on 1999-11-03.
The instruction brings down the upper word of the doubleword register without affecting its upper 16 bits.
- ^ Coldwin, Gynvael (2009-12-29). "BSWAP + 66h prefix". Retrieved 2018-10-03.
internal (zero-)extending the value of a smaller (16-bit) register … applying the bswap to a 32-bit value "00 00 AH AL", … truncated to lower 16-bits, which are "00 00". … Bochs … bswap reg16 acts just like the bswap reg32 … QEMU … ignores the 66h prefix
- ^ Intel "i486 Microprocessor" (April 1989, order no. 240440-001) p.142 lists
CMPXCHGwith0F A6/A7encodings. - ^ Intel "i486 Microprocessor" (November 1989, order no. 240440-002) p.135 lists
CMPXCHGwith0F B0/B1encodings. - ^ "Intel 486 & 486 POD CPUID, S-spec, & Steppings".
- ^ Intel, Software Guard Extensions Programming Reference, order no. 329298-002, oct 2014, sections 3.5 and 3.6.5.
- ^ Frank van Gilluwe, "The Undocumented PC, second edition", 1997, ISBN 0-201-47950-8, page 55
- ^ AMD, Revision Guide for AMD Athlon 64 and AMD Opteron Processors pub.no. 25759, rev 3.79, July 2009, page 34. Archived on 20 Dec 2023.
- ^ Intel, Software Developer’s Manual, vol 3A, order no. 253668-078, Dec 2022, section 9.3, page 299.
- ^ Intel, CPUID Enumeration and Architectural MSRs, 8 Aug 2023. Archived on 23 May 2024.
- ^ AMD, PPR for AMD Family 19h Model 61h, Revision B1 processors, document no. 56713, rev 3.05, mar 8 2023, page 116. Archived on Apr 25, 2023.
- ^ "RSM—Resume from System Management Mode". Archived from the original on 2012-03-12.
- ^ Microprocessor Report, System Management Mode Explained (vol 6, no. 8, june 17, 1992). Archived on Jun 29, 2022.
- ^ Ellis, Simson C., "The 386 SL Microprocessor in Notebook PCs", Intel Corporation, Microcomputer Solutions, March/April 1991, page 20
- ^ Cyrix 486SLC/e Data Sheet (1992), section 2.6.4
- ^ Linux 6.3 kernel sources, /arch/x86/include/asm/cpuid.h, line 69
- ^ gcc-patches mailing list, CPUID Patch for IDT Winchip, May 21, 2019. Archived on Apr 27, 2023.
- ^ Intel, Intel® Virtualization Technology FlexMigration Application Note order no. 323850-004, oct 2012, section 2.3.2 on page 12. Archived on Oct 13, 2014.
- ^ Intel, Atom Processor C3000 Product Family Datasheet order no. 337018-002, Feb 2018, pages 133, 3808 and 3814. Archived on Feb 9, 2022.
- ^ AMD, AMD64 Architecture Programmer’s Manual Volume 3 pub.no. 24594, rev 3.34, oct 2022, p. 165 (entry on
CPUIDinstruction) - ^ Robert Collins, CPUID Algorithm Wars, nov 1996. Archived from the original on dec 18, 2000.
- ^ Geoff Chappell, CMPXCHG8B Support in the 32-Bit Windows Kernel, 23 jan 2008. Archived on 5 Nov 2023.
- ^ a b Intel, Software Developer's Manual, order no. 325426-077, Nov 2022 – the entry on the
RDTSCinstruction on p.1739 describes the instruction sequences required to order theRDTSCinstruction with respect to earlier and later instructions. - ^ Linux kernel 5.4.12, /arch/x86/kernel/cpu/centaur.c
- ^ Stack Overflow, Can constant non-invariant tsc change frequency across cpu states? Accessed 24 Jan 2023. Archived on 24 Jan 2023.
- ^ CPU-World, CPUID for Zhaoxin KaiXian KX-5000 KX-5650 (by timw4mail), 24 Apr 2024. Archived on 26 Apr 2024.
- ^ Michal Necasek, "Undocumented RDTSC", 27 Apr 2018. Archived on 16 Dec 2023.
- ^ Willy Tarreau, Re: i686 quirk for AMD Geode, Linux Kernel Mailing List, 10 Nov 2009.
- ^ Intel, Intel 64 and IA-32 Architectures Optimization Reference Manual: Volume 1, order no. 248966-050US, April 2024, section 3.5.1.9, page 119. Archived on 9 May 2024.
- ^ JookWiki, "nopl", sep 24, 2022 – provides a lengthy account of the history of the long NOP and the issues around it. Archived on oct 28, 2022.
- ^ a b Intel Community: Multibyte NOP Made Official. Archived on 7 Apr 2022.
- ^ Intel Software Developers Manual, vol 3B (order no 253669-076us, December 2021), section 22.15 "Reserved NOP"
- ^ AMD, AMD 64-bit Technology – AMD x86-64 Architecture Programmer’s Manual Volume 3, publication no. 24594, rev 3.02, aug 2002, page 379.
- ^ Debian bug report logs, -686 build uses long noops, that are unsupported by Transmeta Crusoe, immediate crash on boot, see messages 148 and 158 for NOPL on VIA C7. Archived on 1 Aug 2019
- ^ Intel, Intel Architecture Software Developer’s Manual, Volume 2, 1997, order no. 243191-001, pages 3-9 and A-7.
- ^ John Hassey, Pentium Pro changes, GAS2 mailing list, 28 dec 1995 – patch that added the
UD2AandUD2Binstruction mnemomics to GNU Binutils. Archived on 25 Jul 2023. - ^ Jan Beulich, x86: correct UDn, binutils-gdb mailing list, 23 nov 2017 – Binutils patch that added ModR/M byte to
UD1/UD2Band addedUD0. Archived on 25 Jul 2023. - ^ Intel, Intel Pentium 4 and Intel Xeon Processor Optimization Reference Manual, order no. 248966-007, see "Assembly/Compiler Coding Rule 13" on page 74. Archived from the original on 16 Mar 2003.
- ^ Intel, Pentium® Processor Family Developer's Manual Volume 3, 1995. order no. 241430-004, appendix A, page 943 – reserves the opcodes
0F 0Band0F B9. - ^ a b AMD, AMD64 Architecture Programmer’s Manual Volume 3, publication no. 24594, rev 3.17, dec 2011 – see page 416 for
UD0and page 415 and 419 forUD1. - ^ a b c Intel, Software Developer's Manual, vol 2B, order no. 253667-061, dec 2016 – lists
UD1(with ModR/M byte) andUD0(without ModR/M byte) on page 4-687. - ^ Stecklina, Julian (2019-02-08). "Fingerprinting x86 CPUs using Illegal Opcodes". x86.lol. Archived from the original on 15 Dec 2023. Retrieved 2023-12-15.
- ^ "ud0 length fix · intelxed/xed@7561f54". GitHub. Archived from the original on 1 Jun 2023. Retrieved 2023-12-15.
- ^ a b Cyrix, 6x86 processor data book, 1996, order no. 94175-01, table 6-20, page 209 – uses the mnemonic
OIO("Official invalid opcode") for the0F FFopcode. - ^ Intel, Software Developer's Manual, vol 2B, order no. 253667-064, oct 2017 – lists
UD0(with ModR/M byte) on page 4-683. - ^ AMD, AMD-K5 Processor Technical Reference Manual, Nov 1996, order no. 18524C/0, section 3.3.7, page 90 – reserves the
0F FFopcode without assigning it a mnemonic. - ^ AMD, AMD-K6 Processor Data Sheet, order no. 20695H/0, March 1998, section 24.2, page 283.
- ^ George Dunlap, The Intel SYSRET Privilege Escalation, The Xen Project., 13 june 2012. Archived on Mar 15, 2019.
- ^ Intel, AP-485: Intel® Processor Identification and the CPUID Instruction, order no. 241618-039, may 2012, section 5.1.2.5, page 32
- ^ Michal Necasek, "SYSENTER, Where Are You?", 20 Jul 2017. Archived on 29 Nov 2023.
- ^ AMD, Athlon Processor x86 Code Optimization Guide, publication no. 22007, rev K, feb 2002, appendix F, page 284. Archived on 13 Apr 2017.
- ^ Transmeta, Processor Recognition, May 7, 2002.
- ^ VIA, VIA C3 Nehemiah Processor Datasheet, rev 1.13, sep 29, 2004, page 17
- ^ CPU-World, CPUID for Intel Xeon 3.40 GHz – Nocona stepping D CPUID without CMPXCHG16B
- ^ CPU-World, CPUID for Intel Xeon 3.60 GHz – Nocona stepping E CPUID with CMPXCHG16B
- ^ SuperUser StackExchange, How prevalent are old x64 processors lacking the cmpxchg16b instruction?
- ^ Intel SDM order no. 325462-077, apr 2022, vol 2B, p.4-130 "MOVSX/MOVSXD-Move with Sign-Extension" lists MOVSXD without REX.W as "discouraged"
- ^ Anandtech, AMD Zen 3 Ryzen Deep Dive Review, nov 5, 2020, page 6
- ^ @instlatx64 (October 31, 2020). "Saving Private Ryzen: PEXT/PDEP 32/64b replacement functions for #AMD CPUs (BR/#Zen/Zen+/#Zen2) based on @zwegner's zp7" (Tweet). Retrieved 2023-01-20 – via Twitter.
- ^ Wegner, Zach (4 November 2020). "zwegner/zp7". GitHub.
- ^ Intel, Control-flow Enforcement Technology Specification (v3.0, order no. 334525-003, March 2019)
- ^ Intel SDM, rev 076, December 2021, volume 1, section 18.3.1
- ^ Binutils mailing list: x86: CET v2.0: Update NOTRACK prefix
- ^ AMD, Extensions to the 3DNow! and MMX Instruction Sets, ref no. 22466D/0, March 2000, p.11
- ^ Hadi Brais, The Significance of the x86 SFENCE instruction, 26 Feb 2019.
- ^ Intel, Software Developer's Manual, order no. 325426-077, Nov 2022, Volume 1, section 11.4.4.3, page 276.
- ^ Hadi Brais, The Significance of the LFENCE instruction, 14 May 2018
- ^ AMD, Software techniques for managing speculation on AMD processor, rev 3.8.22, 8 March 2022, page 4. Archived on 13 March 2022.
- ^ Intel, Software Developer's Manual, order no. 325426-084, June 2024, vol 3A, section 11.12.3, page 3411 - covers the use of the
MFENCE;LFENCEsequence to enforce ordering between a memory store and a later x2apic MSR write. Archived on 4 Jul 2024 - ^ Intel, Prescott New Instructions Software Developer’s Guide, order no. 252490-003, june 2003, pages 3-26 and 3-38 list
MONITORandMWAITwith explicit operands. Archived on 9 May 2005. - ^ Flat Assembler messageboard, "BLENDVPS/BLENDVPD/PBLENDVB syntax", also covers
MONITOR/MWAITmnemonics. Archived on 6 Nov 2022. - ^ Intel, Intel® Xeon Phi™ Product Family x200 (KNL) User mode (ring 3) MONITOR and MWAIT (archived 5 mar 2017)
- ^ AMD, BIOS and Kernel Developer’s Guide (BKDG) For AMD Family 10h Processors, order no. 31116, rev 3.62, page 419. Archived on Apr 8, 2024.
- ^ R. Zhang et al, (M)WAIT for It: Bridging the Gap between Microarchitectural and Architectural Side Channels, 3 Jan 2023, page 5. Archived from the original on 5 Jan 2023.
- ^ Intel, Architecture Instruction Set Extensions Programming Reference, order no. 319433-052, March 2024, chapter 17. Archived on Apr 7, 2024.
- ^ Guru3D, VIA Zhaoxin x86 4 and 8-core SoC processors launch, Jan 22, 2018
- ^ Vulners, x86: DoS from attempting to use INVPCID with a non-canonical addresses, 20 nov 2018
- ^ Intel, Intel® 64 and IA-32 Architectures Software Developer’s Manual volume 3, order no. 325384-078, december 2022, chapter 23.15
- ^ a b Catherine Easdon, Undocumented CPU Behaviour on x86 and RISC-V Microarchitectures: A Security Perspective, 10 May 2019, page 39
- ^ Instlatx64, Zhaoxin Kaixian KX-6000G CPUID dump, May 15, 2023
- ^ Intel, Willamette Processor Software Developer’s Guide, order no. 245355-001, feb 2000, section 3.5.3, page 294 - lists
HWNT/HSTmnemonics for the branch hint prefixes. Archived from the original on 5 Feb 2005. - ^ Intel, Software Developer's Manual, order no. 325462-083, March 2024 - volume 1, chapter 11.4.5, page 281 and volume 2A, chapter 2.1.1, page 525.
- ^ Intel XED source code, src/dec/xed-disas.c, line 325, 11 Nov 2024. Archived on 24 Nov 2024.
- ^ Intel, Intel 64 and IA-32 Architectures Optimization Reference Manual: Volume 1, order no. 248966-050US, April 2024, chapter 2.1.1.1, page 46.
- ^ a b c Intel, Intel® Software Guard Extensions (Intel® SGX) Architecture for Oversubscription of Secure Memory in a Virtualized Environment, 25 Jun 2017.
- ^ Intel, Runtime Microcode Updates with Intel® Software Guard Extensions, sep 2021, order no. 648682 rev 1.0. Archived from the original on 31 mar 2023.
- ^ Intel, 11th Generation Intel® Core™ Processor Desktop Datasheet, Volume 1, may 2022, order no. 634648-004, section 3.5, page 65
- ^ Intel, Which Platforms Support Intel® Software Guard Extensions (Intel® SGX) SGX2? Archived on 5 May 2022.
- ^ Intel, Trust Domain CPU Architectural Extensions, order no. 343754-002, may 2021.
- ^ @InstLatX64 (May 3, 2022). "The CLDEMOTE Story" (Tweet). Retrieved 2023-01-23 – via Twitter.
- ^ @Instlatx64 (Apr 17, 2023). "20-Core Intel Xeon w7-2475X (SapphireRapids-64L) 806F8 CPUID dump" (Tweet). Retrieved 2023-04-20 – via Twitter.
- ^ Intel, Intel Data Streaming Accelerator Architecture Specification, order no. 341204-004, Sep 2022, pages 13 and 23. Archived on 20 Jul 2023.
- ^ Wikichip, CLZERO – x86
- ^ Intel, Application note AP-578: Software and Hardware Considerations for FPU Exception Handlers for Intel Architecture Processors, order no. 243291-002, February 1997
- ^ Intel, Application Note AP-113: Getting Started With The Numeric Data Processor, feb 1981, pages 24-25
- ^ Intel, 8087 Math Coprocessor, oct 1989, order no. 285385-007, page 3-100, fig 9
- ^ Intel, 80287 80-bit HMOS Numeric Processor Extension, feb 1983, order no. 201920-001, page 14
- ^ Intel, iAPX86, 88 User's Manual, 1981 (order no. 210201-001), p. 797
- ^ a b Intel 80286 and 80287 Programmers Reference Manual, 1987 (order no. 210498-005), p. 485
- ^ Intel Software Developer's Manual volume 3B, revision 064, section 22.18.9
- ^ "GCC Bugzilla – 37179 – GCC emits bad opcode 'ffreep'".
- ^ Michael Steil, FFREEP – the assembly instruction that never existed
- ^ Dusko Koncaliev, Pentium FDIV Bug
- ^ Bruce Dawson, Intel Underestimates Error Bounds by 1.3 quintillion
- ^ Intel SDM, rev 053 and later, describes the exact argument reduction procedure used for
FSIN,FCOS,FSINCOSandFPTANin volume 1, section 8.3.8 - ^ Robert Collins, Undocumented OpCodes: AAM. Archived on 21 Feb 2001
- ^ Retrocomputing StackExchange, 0F1h opcode-prefix on i80286. Archived on 13 Apr 2023.
- ^ a b Frank van Gilluwe, "The Undocumented PC – Second Edition", p. 93-95
- ^ Michal Necasek, Intel 486 Errata?, 6 Dec 2015. Archived on 29 Nov 2023.
- ^ Robert Hummel, "PC Magazine Programmer's Technical Reference" (ISBN 1-56276-016-5) p.728
- ^ Raúl Gutiérrez Sanz, Undocumented 8086 Opcodes, Part I, 27 Dec 2017. Archived on 29 Nov 2023.
- ^ a b "Asm, opcode 82h". 24 Dec 1998. Archived from the original on 14 Apr 2023.
- ^ Intel Corporation 2022, p. 3698.
- ^ Intel, The 8086 Family User's Manual, October 1979, opcodes omitted on pages 4-25 and 4-31
- ^ Retrocomputing StackExchange, Undocumented instructions in x86 CPU prior to 80386?, 4 Jun 2021. Archived on 18 Jul 2023.
- ^ Daniel B. Sedory, An Examination of the Standard MBR, 2000. Archived on 6 Oct 2023.
- ^ AMD, Software Optimization Guide for AMD64 Processors (publication 25112, revision 3.06, sep 2005), section 6.2, p.128
- ^ GCC bugzilla, Bug 48227 – "rep ret" generated for -march=core2. Archived on 9 Apr 2023.
- ^ Raymond Chen, My, what strange NOPs you have!, 12 Jan 2011. Archived on 20 May 2023.
- ^ Jeff Parsons, Intel 80386 CPU information (B1 errata section, item #7). Archived on 13 Nov 2023.
- ^ Intel Software Developers Manual, volume 2B (Jan 2006, order no 235667-018, does not have long NOP)
- ^ Intel Software Developers Manual, volume 2B (March 2006, order no 235667-019, has long NOP)
- ^ Agner Fog, Instruction Tables, AMD K7 section.
- ^ "579838 – glibc not compatible with AMD Geode LX". Archived from the original on 30 Jul 2023.
- ^ Intel Software Developers Manual, volume 2B (April 2005, order no 235667-015, does not list 0F0D-nop)
- ^ Intel Software Developers Manual, volume 2B (June 2005, order no 235667-016, lists 0F0D-nop in opcode table but not under
NOPinstruction description.) - ^ Intel Software Developers Manual, volume 2B (order no. 253667-060, September 2016) does not list
UD0andUD1. - ^ "PCJS : pcjs/x86op0F.js (two-byte x86 opcode handlers), lines 1647–1651". GitHub. 17 April 2022. Archived from the original on 13 Apr 2023.
- ^ "80486 paging protection faults? \ VOGONS". Archived from the original on 9 April 2022.
- ^ "Invalid opcode handling \ VOGONS". Archived from the original on 9 April 2022.
- ^ "Invalid instructions cause exit even if Int 6 is hooked \ VOGONS". Archived from the original on 9 April 2022.
- ^ "Tutorial – Calling Win32 from DOS". Ragestorm. 17 Sep 2005. Archived from the original on 9 April 2022.
- ^ "Accessing Windows device drivers from DOS programs". Archived from the original on 8 Nov 2011.
- ^ a b "8086 microcode disassembled". Reenigne blog. 2020-09-03. Archived from the original on 8 Dec 2023. Retrieved 2022-07-26.
Using the REP or REPNE prefix with a MUL or IMUL instruction negates the product. Using the REP or REPNE prefix with an IDIV instruction negates the quotient.
- ^ "Re: Undocumented opcodes (HINT_NOP)". Archived from the original on 2004-11-06. Retrieved 2010-11-07.
- ^ "Re: Also some undocumented 0Fh opcodes". Archived from the original on 2003-06-26. Retrieved 2010-11-07.
- ^ Intel's RCCE library for the SCC used opcode
0F 0Afor SCC's message invalidation instruction. - ^ Intel Labs, SCC External Architecture Specification (EAS), Revision 0.94, p.29. Archived on May 22, 2022.
- ^ "Undocumented x86 instructions to control the CPU at the microarchitecture level in modern Intel processors" (PDF). 9 July 2021.
- ^ Robert R. Collins, Undocumented OpCodes: UMOV. Archived on Feb 21, 2001.
- ^ Herbert Oppmann, NXOP (Opcode 0Fh 55h)
- ^ Herbert Oppmann, NexGen Nx586 Hypercode Source, see COMMON.INC. Archived on 9 Apr 2023.
- ^ Herbert Oppmann, Inside the NexGen Nx586 System BIOS. Archived on 29 Dec 2023.
- ^ Intel, XuCode: An Innovative Technology for Implementing Complex Instruction Flows, May 6, 2021. Archived on Jul 19, 2022.
- ^ Grzegorz Mazur, AMD 3DNow! undocumented instructions
- ^ a b "Undocumented 3DNow! Instructions". grafi.ii.pw.edu.pl. Archived from the original on 30 January 2003. Retrieved 22 February 2022.
- ^ Potemkin's Hacker Group's OPCODE.LST, v4.51, 15 Oct 1999. Archived on 21 May 2001.
- ^ "[UCA CPU Analysis] Prototype UMC Green CPU U5S-SUPER33". 25 May 2020. Archived from the original on 9 Jun 2023.
- ^ Agner Fog, The Microarchitecture of Intel, AMD and VIA CPUs, section 3.4 "Branch Prediction in P4 and P4E". Archived on 7 Jan 2024.
- ^ Reddit /r/Amd discussion thread: Ryzen has undocumented support for FMA4
- ^ a b Christopher Domas, Breaking the x86 ISA, 27 July 2017. Archived on 27 Dec 2023.
- ^ a b Xixing Li et al, UISFuzz: An Efficient Fuzzing Method for CPU Undocumented Instruction Searching, 9 Oct 2019. Archived on 27 Dec 2023.
- ^ Microprocessor Report, MediaGX Targets Low-Cost PCs (vol 11, no. 3, mar 10, 1997). Archived on 6 Jun 2022.
- ^ "Welcome to the OpenSSL Project". GitHub. 21 April 2022. Archived from the original on 4 Jan 2022.
- ^ LKML, (PATCH) crypto: Zhaoxin: Hardware Engine Driver for SHA1/256/384/512, 2 Aug 2023. Archived on 17 Jan 2024.
- ^ Kary Jin, PATCH: Update PadLock engine for VIA C7 and Nano CPUs, openssl-dev mailing list, 10 Jun 2011. Archived on 11 Feb 2022.
- ^ ab OpenEuler メーリングリスト、PATCH kernel-4.19 v2 5/6 : x86/cpufeatures: Zhaoxin 機能ビットを追加。2022 年 4 月 9 日にアーカイブ。
- ^ USPTO/Zhaoxin、特許出願US2023/006718:ハッシュ暗号化アルゴリズムを備えたプロセッサおよびそのデータ処理、13ページおよび45ページ、2023年3月2日。2023年9月12日にアーカイブ。
- ^ LKML、(PATCH) crypto: x86/sm2 -add Zhaoxin SM2 アルゴリズム実装、2023年11月11日。2024年1月17日にアーカイブ。
- ^ ab InstLatx64、Zhaoxin KaiXian KX-6000G の CPUID ダンプ – SM2 および xmodx 機能ビットが設定されています ( CPUIDリーフ C0000001:EDX: ビット 0 および 29)。2023 年 7 月 25 日にアーカイブされました。
- ^ OpenEulerカーネルプルリクエスト2602:x86 / delay:Zhaoxin ZXPAUSE命令のサポートを追加。Gitee 。 2023年10月26日。2024年1月22日にアーカイブ。
- ^ Intel XED の ISA データファイル (2022 年 4 月 17 日)、行 916-944
- ^ Cyrix 6x86 プロセッサ データブック、6-34 ページ
- ^ AMD Geode LX プロセッサ データブック、出版物 33234H、p.670
- Intel Corporation (2022 年 4 月)。「Intel 64 および IA-32 アーキテクチャ ソフトウェア開発者マニュアル、結合巻: 1、2A、2B、2C、2D、3A、3B、3C、3D、4」。Intel。2022年6月 21 日閲覧。
外部リンク
- Intel が提供する無料の IA-32 および x86-64 ドキュメント
- AMD64 アーキテクチャ プログラマーズ マニュアル、第 1 巻から第 5 巻、AMD 提供
- x86 オペコードと命令リファレンス
- x86 および amd64 命令リファレンス
- 命令表: Intel、AMD、VIA CPU の命令レイテンシ、スループット、マイクロオペレーションの内訳のリスト
- Netwide アセンブラ命令リスト ( Netwide アセンブラより)
