ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
A | B | C | D | E |
F | G | H | I | J |
K | L | M | N | O |
P | Q | R | S | T |
U | V | W | X | Y |
Z | 数字 | 記号 |
x86の命令セットアーキテクチャーを64ビットに拡張したものの俗称。
以下は、AMD64 ISA、Intel 64ともに共通する。
ロングモード環境では、次のような特徴を有する。
REX.Wは、REXプリフィクスのWフィールドが1となるバイト。他のフィールドが0なら48hだが、他のフィールド次第で、48hから4fhまで変化する。
REX.W 63 /r : ダブルワードをクアッドワードに符号拡張して転送する
REX.W 98 : EAXを符号拡張してRAXに設定
REX.W 99 : RAXを符号拡張してRDX:RAXに設定
REX.W A7 : 文字列オペランド比較
66 CF
REX.W CF
E3 cb : jcxz(CX)、jecxz(ECX)に対し、64ビットのRCXでの比較
REX.W AD : rax = [rsi++]
REX.W A5
9D : popfdは66 9D
9C : pushfdは66 9C
REX.W AF
REX.W AB
0F 01 F8
0F 05
0F 07
REX.W 0F C7 (CPUID命令のCMPXCHG16Bビットが1の場合のみ)
REX.W 0F B7 /r : ダブルワードをクアッドワードにゼロ拡張して転送する
64ビットで無効命令となった1バイトオペコードのうち、割り当てが決まっていないものには以下のものがある。
将来的に、何らかの拡張に使われると思われる。
具体的には、ロングモードでは標準で32ビットレジスター参照となり、従来の32ビット動作と互換性がある。
例えば、次の命令を例とする。
16ビットの場合は「66」のプリフィックスを付ける。ここまではIA-32と同様である。
64ビット演算の場合は、REXプリフィックスを付けてビット長を制御する。この点がIA-32との違いである。例えば「48」のプリフィックスを付けると、次のようになる。
この目的のため、1バイト目が40H〜4FHの範囲は、従来のx86命令と互換性がない。
なお、8ビットの場合はIA-32と同様、1バイト目のWフィールドを0にして表現する。
REXプリフィックスのため、0x40〜0x4fから始まる旧来のx86命令(inc reg16、dec reg16)はロングモードでは使用できず、これはロングモードでは別の機械語コードを使用する。
例えば、40のinc eaxは、AMD64 ISAではFF C0になる。この2バイトでの表現は従来のx86から存在したが、冗長となるため従来は使われていなかったものである。
プログラム動作中にロングモードかどうかを確認するには、IA32_EFERレジスターのビット8を参照し(但し特権命令(RING 0)でないと参照できない)、ここが1ならロングモードと判断する。
コメントなどを投稿するフォームは、日本語対応時のみ表示されます