x86-64 命令の概要
一般のプログラムで使用する整数用の命令を解説します。浮動小数点を扱うFPU や SSE2 の命令は(当面)扱いません。 64ビットモードで使用可能な命令に限定しています。命令の前においてパラメータのサイズを指定するプリフィックスは デフォルトアドレスサイズは64ビット、デフォルトオペランドサイズは32ビットの場合に使用するものとなります。
データ転送命令
レジスタ間、レジスタ・メモリ間でデータをコピーする命令をデータ転送命令といいます。 プログラム中で最もよく使われる命令です。 データ転送命令は単にコピーを行う MOVe とデータのサイズを拡張するCBW、CWD、 データサイズを拡張して転送する MOVESX (MOVe Sign eXtend)、 MOVEZX (MOVe Zero eXtend)があります。
フラグレジスタの内容(条件)ににしたがって転送をする場合としない場合がある、 条件転送命令 (Conditional MOVe) もデータ転送命令に分類できますが、ここでは条件分岐命令に分類することにします。 またスタック領域のメモリとレジスタ間の転送はスタック操作命令に分類することにします。
| ニーモニック | 命令の動作 |
|---|---|
| MOV | データ転送 |
| CBW / CWDE / CDQE | rAX レジスタを2倍のビット数に符号拡張 |
| CWD / CDQ / CQO | rAX レジスタを rDX:rAX レジスタに符号拡張 |
| MOVSX | 符号拡張と転送 |
| MOVZX | ゼロ拡張と転送 |
| LEA | 実効アドレスのレジスタへのロード |
| BSWAP | エンディアン変更 |
| XCHG | データ交換 |
| NOP | 何もしない |
演算命令
加減乗除の四則演算を行う算術演算、ビットごとの論理演算をレジスタ間、レジスタ・メモリ間で行う命令があります。
| ニーモニック | 命令の動作 |
|---|---|
| ADD | 整数加算 |
| ADC | キャリーを含む整数加算 |
| SUB | 整数減算 |
| SBB | キャリー(ボロー)を含む整数減算 |
| INC | 1 の加算 |
| DEC | 1 の減算 |
| NEG | 2の補数(正負の反転) |
| AND | ビット毎の論理積 |
| OR | ビット毎の論理和 |
| XOR | ビット毎の排他的論理和 |
| NOT | ビットの反転(1の補数) |
| MUL | 符号無し整数乗算 |
| IMUL | 符号付き数の整数乗算 |
| DIV | 符号無し整数除算 |
| IDIV | 符号付き数の整数除算 |
| CMP | 減算による比較 |
| TEST | ビット毎の論理積による比較 |
シフト/ローテイト命令
シフト/ローテイト命令はレジスタの数値(ビット列)を左右にずらす命令です。 ずれてはみ出した分を反対側から戻す場合はローテイト命令を使用します。
| ニーモニック | 命令の動作 |
|---|---|
| SAR | 算術的右シフト |
| SHR | 論理的右シフト |
| SAL SHL | 左シフト |
| SHLD | 連結したレジスタを右シフト |
| SHRD | 連結したレジスタを左シフト |
| ROR | 右ローテイト |
| ROL | 左ローテイト |
| RCR | キャリーを含む右ローテイト |
| RCL | キャリーを含む左ローテイト |
以下作成中
命令表の記号の意味
各命令のフォーマット表の中で使っているオペコードとオペランド欄で使用している記号の意味を示します。 アセンブラが知っているので覚える必要はありません。また rAX のように表記している部分は、AX、EAX、RAX のどれかを示しています。
プリフィックス
| 記号 | 意味 |
|---|---|
| 66 | デフォルトオペランドサイズを変更する |
| REX | R8-R15レジスタを使用する |
| REX.W | 64ビットレジスタを使用する |
オペコード
| 記号 | 意味 |
|---|---|
| /0 - /7 | ModR/M バイト の reg フィールドの 0 から 7 の数字はオペコードの拡張用に使われる。 r/m フィールドだけをオペランドに使用する。 |
| /r | 命令には ModR/M バイトが続き、レジスタオペランドと r/m オペランドの両方を使う。 |
| cb、cw、cd、cp, co, ct | オペコードの後に 1 バイト(cb)、2 バイト(cw)、4 バイト(cd)、 6 バイト(cp)、 8 バイト(co)または 10 バイト(ct)が続く。 |
| ib, iw, id, io | オペコード、ModM/R バイト、または SIB の後に続く 1 バイト(ib)、2 バイト(iw)、 4 バイト(id)または 8 バイト(io)の定数(即値)。 |
| +rb, +rw, +rd, +ro | + の左側のオペコードに加算される 0 から 7 までのレジスタコード。 結果として 1 バイトのオペコードとなる。 |
オペランド
| 記号 | 意味 |
|---|---|
| r8 | 8ビットレジスタ |
| r16 | 16ビットレジスタ |
| r32 | 32ビットレジスタ |
| r64 | 64ビットレジスタ |
| r/m8 | 8ビットレジスタ、または 1 バイトのメモリ |
| r/m16 | 16ビットレジスタ、または 2 バイトのメモリ |
| r/m32 | 32ビットレジスタ、または 4 バイトのメモリ |
| r/m64 | 64ビットレジスタ、または 8 バイトのメモリ |
| m8 | 1 バイトのメモリ |
| m16 | 2 バイトのメモリ |
| m32 | 4 バイトのメモリ |
| m64 | 8 バイトのメモリ |
| imm8 | 8ビット定数 |
| imm16 | 16ビット定数 |
| imm32 | 32ビット定数 |
| imm64 | 64ビット定数 |
| AL | RAXレジスタの下位 8 ビット |
| AX | RAXレジスタの下位 16 ビット |
| EAX | RAXレジスタの下位 32 ビット |
| moffsXX | 指定ビットのメモリオフセット(気にしなくてもかまいません) |