• 検索結果がありません。

汎用命令は、以下のサブグループに分けられる。

データ転送命令

・ 2

進算術命令

・ 10

進算術命令

論理演算命令

シフト命令とローテート命令

ビット命令とバイト命令

制御転送命令

ストリング命令

・ I/O

命令

・ ENTER

命令と

LEAVE

命令

フラグ制御命令

図7-1. 汎用命令の基本実行環境

0 232 -1

アドレス空間

汎用レジスタ

EIP(命令ポインタレジスタ)

EFLAGSレジスタ

セグメント・

32ビット 32ビット 832ビット)

レジスタ 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. スタック操作命令

PUSH、POP、PUSHA(push all registers)

、POPA(pop all registers)命令は、スタック との間でデータを転送する。

PUSH

命令は、(

ESP

レジスタ内の)スタックポインタを デクリメントし、ソース・オペランドをスタックのトップにコピーする(図

7-2.

を参 照)。この命令は、メモリ・オペランド、即値オペランド、レジスタ・オペランド(セ グメント・レジスタを含む)を操作する。PUSH命令は、通常は、プロシージャを呼 び出す前にスタック上にパラメータを置くのに使用される。また、PUSH命令を使用 して、スタック上に一時的変数用の空間を確保できる。