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 指定ビットのメモリオフセット(気にしなくてもかまいません)

続く...