eax/ax/ah/al | アキュムレータ | |
ebx/bx/bh/bl | ベース・レジスタ | |
ecx/cx/ch/cl | カウンタ・レジスタ | ループをカウントするのに使う、事もある |
edx/dx/dh/dl | データ・レジスタ | |
esp/sp | スタック・ポインタ | スタックの頭を示す |
ebp/bp | ベース・ポインタ | 普通Cだとコンパイラがスタックフレームを形成するときに使う |
esi/si | ソース・インデックス | メモリの間接指定をするために使う(Cでいうポインタ) |
edi/di | ディスティネーション・インデックス | メモリの間接指定をするために使う(Cでいうポインタ) |
Opcode | Operands | Clock cycles | Pairability |
NOP | 1 | uv | |
MOV | r/m, r/m/i | 1 | uv |
MOV | r/m, sr | 1 | np |
MOV | sr, r/m | >= 2 b) | np |
XCHG | (E)AX, r | 2 | np |
XCHG | r,r | 3 | np |
XCHG | r,m | >20 | np |
XLAT | 1 | np | |
PUSH | r/i | 1 | uv |
POP | r | 1 | uv |
PUSH | m | 2 | np |
POP | m | 3 | np |
PUSH | sr | 1 | np |
POP | sr | >=3 | np |
PUSHF | 4 | np | |
POPF | 6 | np | |
PUSHA POPA | 5 | np | |
LAHF SAHF | 2 | np | |
MOVSX | r,r/m | 3 | np |
MOVZX | r,r/m | 3 | np |
LEA | r/m | 1 | np |
LDS LES LFS LGS LSS | m | 4 | np |
ADD SUB AND OR XOR | r,r/i | 1 | uv |
ADD SUB AND OR XOR | r,m | 2 | uv |
ADD SUB AND OR XOR | m,r/i | 3 | uv |
CMP | r,r/i | 1 | uv |
CMP | m,r/i | 2 | uv |
TEST | r,r | 1 | uv |
TEST | m,r | 2 | uv |
TEST | r,i | 1 | ※f |
TEST | m,i | 2 | np |
ADC SBB | r/m,r/m/i | 1/3 | u |
INC DEC | r | 1 | uv |
INC DEC | m | 3 | uv |
NEG NOT | r/m | 1/3 | np |
MUL IMUL | r/r16/m8/m16 | 11 | np |
MUL IMUL | 他の組み合わせ | 9 | np |
DIV | r8/r16/r32 | 17/25/41 | np |
IDIV | r8/r16/r32 | 22/30/46 | np |
CBW CWDE | 3 | np | |
CWD CDQ | 2 | np | |
SHR SHL SAR SAL | r,i | 1 | u |
SHR SHL SAR SAL | m,i | 3 | u |
SHR SHL SAR SAL | r/m,CL | 4/5 | np |
ROR ROL RCR RCL | r/m,1 | 1/3 | u |
ROR ROL | r/m,i(!=1) | 1/3 | np |
ROR ROL | r/m,CL | 4/5 | np |
RCR RCL | r/m.i(!=1) | 8/10 | np |
RCR RCL | r/m,CL | 7/9 | np |
SHLD SHRD | r,i/CL | 4 | np |
SHLD SHRD | m,i/CL | 5 | np |
BT | r,r/i | 4 | np |
BT | m,i | 4 | np |
BT | m,r | 9 | np |
BTR BTS BTC | r,r/i | 7 | np |
BTR BTS BTC | m,i | 8 | np |
BTR BTS BTC | m,r | 14 | np |
BSF BSR | r,r/m | 7-23 | np |
SETcc | r/m | 1 | np |
JMP CALL | short/near | 1 | v |
JMP CALL | far | >=3 | np |
条件JMP | short/near | 1/4/5 | v |
CALL JMP | r/m | 2 | np |
RETN | 2 | np | |
RETN | i | 3 | np |
RETF | 4 | np | |
RETF | i | 5 | np |
J(E)CXZ | short | 5-10 | np |
LOOP | short | 5-10 | np |
BOUND | r,m | 8 | np |
CLC STC CMC CLS STD | 2 | np | |
CLI STI | 6-7 | np | |
LODS | 2 | np | |
REP LODS | 7+3*n | np | |
STOS | 3 | np | |
REP STOS | 10+n | np | |
MOVS | 4 | np | |
REP MOVSB | 12+1.8*n | np | |
REP MOVSW | 12+1.5*n | np | |
REP MOVSD | 12+n | np | |
SCAS | 4 | ||
REP(N)E SCAS | 9+4*n | ||
CMPS | 5 | np | |
REP(N)E CMPS | 8+5*n | np | |
BSWAP | 1 | np |
Clock cycles | 命令を終えるのに掛かる時間 | ||||||||
Pairability | どのパイプラインで組み合わせるかを示します
|
※f | 1byte instruction code + 4bytes data のときだけpairingできる |
ニーモニック 動作 mov a,b ;a=b push a ;aをstackに積む pop a ;stackから取り出してaに代入 lea a,b ;実行アドレスのロード 算術演算命令 add a,b ;a+=b sub a,b ;a-=b mul a ;eax*=a (符号無し) imul a,b,c ;a=b*c (符号有り) div a ;eax/=a (符号無し) idiv a ;eax/=a (符号有り) cmp a,b ;aとbの比較(内部で減算をしているだけ) 論理演算 not a ;a=~a and a,b ;a&=b or a,b ;a|=b xor a,b ;a^=b shl a,b ;a<<=b (符号無し) shr a,b ;a>>=b (符号無し) sal a,b ;a<<=b (符号有り) sar a,b ;a>>=b (符号有り) 分岐 call adress ;サブルーチンコール jmp adress ;ジャンプ 条件分岐 符号無し 符号有り a>b ja(jnbe) jg(jnle) a>=b jae(jnb) jge(jnl) a=b je(jz) je(jz) a<=b jbe(jna) jle(jng) a<b jb(jnae) jl(jnge) a!=b jne(jnz) jne(jnz)
//a+bの値を返す関数 int f(int a,int b) { __asm { mov eax,a ;eaxにaを代入します mov ebx,b ;ebxにbを代入します add eax,ebx ;eaxにebxを加算します } }
static int a[1024]; void f(int n) //配列変数から値を取り出す { __asm { mov ebx,n mov eax,[a+ebx*4] } }
MOV EAX, EBX / MOV ECX, EAX ; 書いた後に読むのでpairing不可 MOV EAX, 1 / MOV EAX, 2 ; 書いた後に書くのでpairing不可
MOV AL, BL / MOV AH, 0 ; 同じレジスタの違った場所に書くのはpairing不可
P5の場合メモリ空間は4byte(dword)単位で扱っています。 MOV AL, [ESI] / MOV BL, [ESI+1] ; 同じdwordに書くのでダメ MOV AL, [ESI+3] / MOV BL, [ESI+4] ; 違うdwordに書くので良い
MOV [ESI], EAX / MOV [ESI+32000], EBX ; だめ MOV [ESI], EAX / MOV [ESI+32004], EBX ; OK
確かにフラグが変化するのが駄目だとしたらpairingなんて価値ないわな(^^; SHR EAX,4 / INC EBX ; OK
CMP EAX, 2 / JA LabelBigger ; OK
PUSH EAX / CALL MySub ; OK PUSH AX / PUSH BX ; 32bitmodeのときはOK ; 16bitmodeのとき、もしSPが4で割れるなら4つめのルールによりpairing不可
MOV DWORD PTR DS:[1000], 0 ; not pairable or only in U-pipe CMP BYTE PTR [EBX+8], 1 ; not pairable or only in U-pipe CMP BYTE PTR [EBX], 1 ; pairable CMP BYTE PTR [EBX+8], AL ; pairable
普通 imul eax,217 ;11clock と考えるかもしれませんが答えはなんと mov ecx,eax ;1 U-pipe shl eax,3 ;2 U-pipe(SHLはU固定) sub eax,ecx ;3 U-pipe(eax書き込んだ後だからpairing不可) mov ecx,eax ;4 U-pipe(eax書き込んだ後だからpairing不可) shl eax,5 ;5 U-pipe(SHLはU固定) sub eax,ecx ;6 U-pipe(eax書き込んだ後だからpairing不可) ことごとくpairing出来ませんがそれでも6clockで終わります。
lea eax,[ebx+ecx*8-1000] ;実効アドレスのロード ;なのでebx+8*ecx-1000の指す内容を代入しているわけではありません です(笑)。うーむ恐ろしいまでに強力なアドレッシングモード(^^;;
lea eax,[eax+eax*4] add eax,eax これまたアドレッシングモードを利用した技でした。