汎用命令は、以下のサブグループに分けられる。
・
データ転送命令・ 2
進算術命令・ 10
進算術命令・
論理演算命令・
シフト命令とローテート命令・
ビット命令とバイト命令・
制御転送命令・
ストリング命令・ I/O
命令・ ENTER
命令とLEAVE
命令・
フラグ制御命令図7-1. 汎用命令の基本実行環境
0 232 -1
アドレス空間
汎用レジスタ
EIP(命令ポインタレジスタ)
EFLAGSレジスタ
セグメント・
32ビット 32ビット 8個(32ビット)
レジスタ 6個(16ビット)
汎用命令による プログラミング
7
・
セグメント・レジスタ命令・
その他の命令汎用命令のサブグループの簡単な一覧は、5.1.節「汎用命令」を参照のこと。
7.2.1.
データ転送命令データ転送命令は、メモリとプロセッサ・レジスタの間およびレジスタ同士の間で、
バイト、ワード、ダブルワード、またはクワッドワードを転送する。説明のため、こ れらの命令は次の下位のサブグループに分けられる。
・
汎用データ転送命令・
交換命令・
スタック操作命令・
型変換命令7.2.1.1. 汎用データ転送命令
転送命令。
MOV
(move
)命令とCMOVcc
(conditional move
)命令は、メモリとレジ スタの間またはレジスタ同士の間でデータを転送する。MOV
命令は、メモリとプロセッサ・レジスタの間の基本的なデータロード/
データス トア操作と、レジスタ間のデータ転送操作を実行する。この命令は、表7-1.
に示した パス上のデータ転送を処理する(コントロール・レジスタおよびデバッグレジスタと の間のデータの転送については、『IA-32
インテル®アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル、中巻
A
』の第3
章「命令セット・リファレンスA-M
」 の「MOV -
コントロール・レジスタとの間の転送」と「MOV -
デバッグレジスタとの 間の転送」を参照)。MOV
命令は、あるメモリ・ロケーションから他のメモリ・ロケーションにデータを 転送することや、あるセグメント・レジスタから他のセグメント・レジスタにデータ を転送することはできない。メモリからメモリへの転送は、MOVS
(string move
)命 令で実行する必要がある(7.2.8.項「ストリングの操作」を参照)。条件付き転送命令。CMOVcc 命令は、EFLAGSレジスタ内のステータス・フラグの状 態をチェックし、フラグが指定の状態(または条件)である場合に転送動作を実行す る命令グループである。これらの命令を使用して、メモリから汎用レジスタに、また はある汎用レジスタから他の汎用レジスタに、16ビットまたは
32
ビットの値を転送 できる。各命令でテストされるフラグの状態は、その命令に関連する条件コード(cc ) で指定される。指定の条件が満たされない場合は、転送は実行されず、CMOVcc 命令 の次の命令からプログラムの実行が再開される。IA-32 インテル® アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル 上巻:基本アーキテクチャ
7-4
表
7-2.は、 CMOVcc 命令のニーモニックと、各命令でテストされる条件を示している。
CMOVcc 命令のニーモニックは、 "CMOV"
に条件コード・ニーモニックを付加したも のである。表7-2.
にペアで示した命令(例えば、CMOVA/CMOVNBE)は、同じ命令 の別名である。アセンブラは、プログラム・リストが読みやすくなるように、これら の別名を用意している。CMOVcc 命令によって、小さな IF
構造を削減するのに便利である。また、CMOVcc 命
令を使用して、IF
文による分岐のオーバーヘッドとプロセッサによる分岐の予測ミス の可能性を減らすことができる。これらの条件付き転送命令は、
P6
ファミリ・プロセッサ、インテル®Pentium
®4
プロ セッサ、インテル®Xeon™
プロセッサでのみサポートされている。ソフトウェアは、CPUID
命令を使用してプロセッサの機能情報をチェックすることによって、CMOVcc
命令がサポートされているかどうかを確認できる(『IA-32 インテル®アーキテクチャ・
ソフトウェア・デベロッパーズ・マニュアル、中巻
A
』の第3
章「命令セット・リファ レンスA-M
」の「CPUID - CPU
の識別」を参照)。7.2.1.2. 交換命令
交換命令は、
1
つ以上のオペランドの内容を入れ替える。場合によっては、LOCK
信 号のアサートや、EFLAGS
レジスタ内のフラグの変更などの追加の操作も実行する。XCHG
(exchange
)命令は、2
つのオペランドの内容を入れ替える。この命令は、3
つ のMOV
命令と同じ効果を持つが、一方のオペランドをロードする間に他方のオペラ ンドの内容を保存するための一時的なロケーションを必要としない。XCHG
命令でメ モリ・オペランドを処理するときは、プロセッサのLOCK
信号が自動的にアサートさ れる。この命令は、プロセスの同期をとるためにセマフォまたは同様のデータ構造を 実装するのに便利である。バスロックについての詳細は、『IA-32
インテル®アーキテ表7-1. 転送命令の動作
データ転送のタイプ ソース → デスティネーション メモリからレジスタへ メモリ・ロケーション → 汎用レジスタ
メモリ・ロケーション → セグメント・レジスタ レジスタからメモリへ 汎用レジスタ → メモリ・ロケーション
セグメント・レジスタ → メモリ・ロケーション レジスタ同士の間 汎用レジスタ → 汎用レジスタ
汎用レジスタ → セグメント・レジスタ セグメント・レジスタ → 汎用レジスタ 汎用レジスタ → コントロール・レジスタ コントロール・レジスタ → 汎用レジスタ 汎用レジスタ → デバッグレジスタ デバッグレジスタ → 汎用レジスタ 即値データからレジスタへ 即値 → 汎用レジスタ
即値データからメモリへ 即値 → メモリ・ロケーション
汎用命令による プログラミング
7
クチャ・ソフトウェア・デベロッパーズ・マニュアル、下巻』の第
7
章の「バスロッ ク」を参照。BSWAP
(byte swap
)命令は、32
ビット・レジスタ・オペランドのバイト・オーダを 反転する。ビット位置0
~7
は24
~31
で置き換えられ、ビット位置8
~15
は16
~23
で置き換えられる。この命令を2
回続けて実行すると、レジスタは前と同じ値になる。BSWAP
命令は、「ビッグ・エンディアン」データ・フォーマットと「リトル・エンディアン」データ・フォーマットの変換に便利である。また、この命令によって、
10
進算術演算の実行を高速化できる(XCHG
命令を使用して、ワード内の上位バイトと 下位バイトを入れ替えられる)。XADD(exchange and add)命令は、 2
つのオペランドを入れ替えて、2
つのオペランド の和をデスティネーション・オペランドに格納する。EFLAGSレジスタ内のステータ スフラグは、加算の結果を示す。マルチプロセッサ・システムでは、この命令とLOCK
プリフィックス(『IA-32 インテル®アーキテクチャ・ソフトウェア・デベロッパーズ・
マニュアル、中巻 A』の第
3
章「命令セット・リファレンス A-M」の「LOCK - LOCK#信号アサート・プリフィックス」を参照)を組み合わせて、複数のプロセッサに
1
つ の DO ループを実行できる。表7-2. 条件付き転送命令
命令ニーモニック ステータス・フラグの状態 条件の説明 符号なし条件付き転送
CMOVA/CMOVNBE (CF or ZF)=0 より大きい/より小さくなく等しくない
CMOVAE/CMOVNB CF=0 より大きいか等しい/より小さくない
CMOVNC CF=0 キャリーなし
CMOVB/CMOVNAE CF=1 より小さい/より大きくなく等しくない
CMOVC CF=1 キャリー
CMOVBE/CMOVNA (CF or ZF)=1 より小さいか等しい/より大きくない
CMOVE/CMOVZ ZF=1 等しい/ゼロ
CMOVNE/CMOVNZ ZF=0 等しくない/ゼロでない
CMOVP/CMOVPE PF=1 パリティ/偶数パリティ
CMOVNP/CMOVPO PF=0 パリティなし/奇数パリティ
符号付き条件付き転送
CMOVGE/CMOVNL (SF xor OF)=0 より大きいか等しい/より小さくない
CMOVL/CMOVNGE (SF xor OF)=1 より小さい/より大きくなく等しくない
CMOVLE/CMOVNG ((SF xor OF) or ZF)=1 より小さいか等しい/より大きくない
CMOVO OF=1 オーバーフロー
CMOVNO OF=0 オーバーフローなし
CMOVS SF=1 符号(負)
CMOVNS SF=0 符号なし(負でない)
IA-32 インテル® アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル 上巻:基本アーキテクチャ
7-6
CMPXCHG
(compare and exchange
)命令とCMPXCHG8B
(compare and exchange 8 bytes
) 命令を使用して、複数のプロセッサを使用するシステム内で、動作の同期をとること ができる。CMPXCHG
命令は、3
つのオペランド(レジスタ内のソース・オペランド、EAX
レジスタ内のもう1
つのソース・オペランド、およびデスティネーション・オペ ランド)を必要とする。デスティネーション・オペランド内の値とEAX
レジスタの値 が等しい場合は、デスティネーション・オペランドは他のソース・オペランドの値(
EAX
レジスタ内にない値)で置き換えられる。それ以外の場合は、デスティネーショ ン・オペランドの元の値がEAX
レジスタにロードされる。EFLAGS
レジスタのステー タスフラグは、EAX
レジスタの値からデスティネーション・オペランドを引くことに よって得られる結果を反映する。CMPXCHG
命令は、セマフォのテストと変更によく使用される。この命令は、セマフォが空いているかどうかをチェックする。セマフォが空いている場合は、そのセマ フォは割り当て済みとしてマークされる。セマフォが空いていない場合は、そのセマ フォは現在のオーナの
ID
を取得する。これらはすべて、割り込みをかけられない1
つ の動作として実行される。シングルプロセッサ・システムでは、CMPXCHG
命令を使 用すると、複数の命令を実行してセマフォのテストと変更を行う前に、保護レベル0
に切り替えて割り込みを無効にする必要がなくなる。マルチプロセッサ・システムでは、CMPXCHG命令と
LOCKプリフィックスを組み合
わせて、比較操作と交換操作をアトミックに実行できる(アトミック操作についての 詳細は、『IA-32 インテル®アーキテクチャ・ソフトウェア・デベロッパーズ・マニュ
アル、下巻』の第7
章の「ロックされたアトミック操作」を参照)。CMPXCHG8B命令も、 3つのオペランド(EDX:EAXレジスタ内の64ビット値、 ECX:EBX
レジスタ内の64
ビット値、メモリ内のデスティネーション・オペランド)を必要とす る。この命令は、EDX:EAXレジスタ内の64
ビット値とデスティネーション・オペラ ンドを比較する。2
つの値が等しい場合は、ECX:EBX
レジスタ内の64
ビット値がデス ティネーション・オペランドに格納される。EDX:EAXレジスタとデスティネーショ ンが等しくない場合は、デスティネーションがEDX:EAX
レジスタにロードされる。CMPXCHG8B
命令とLOCK
プリフィックスを組み合わせれば、この操作をアトミックに実行できる。
7.2.1.3. スタック操作命令