シフト/ローテイト命令
シフト命令はビット操作、2のべき乗による乗算、除算、ローテイト命令はシフト命令と組み合わせて多倍長のシフトなどに使います。 キャリーフラグの 1 ビットが利用できるところが、C言語などのシフト演算子と異なります。シフトするビット数は1バイトの定数または ECX レジスタの最下位バイト (CLレジスタ) で指定します。
SAL,SHL
レジスタまたはメモリの内容を指定ビット数左シフトします。最下位ビットには0が入ります。 同じ命令にSHLとSALという2つのニーモニックが割り当てられています。元の最上位ビットはキャリーフラグに入ります。
表記 : SAL OP1, OP2 表記 : SHL OP1, OP2 動作 : OP1 = [ CF←□□□□□□□□□□□□□□□□←0 ] を OP2 回繰り返す
プリフィックス | オペコード | 命令 | 説明 |
---|---|---|---|
- | D0 /4 | SAL r/m8, 1 | r/m8 を1 bit 左シフトする。。 |
REX | D0 /4 | SAL r/m8, 1 | r/m8 を1 bit 左シフトする。。 |
- | D2 /4 | SAL r/m8, CL | r/m8 をCL bit 左シフトする。。 |
REX | D2 /4 | SAL r/m8, CL | r/m8 をCL bit 左シフトする。。 |
- | C0 /4 ib | SAL r/m8, imm8 | r/m8 をimm8 bit 左シフトする。。 |
REX | C0 /4 ib | SAL r/m8, imm8 | r/m8 に2 をimm8 bit 左シフトする。。 |
66 | D1 /4 | SAL r/m16, 1 | r/m16 を1 bit 左シフトする。。 |
- | D1 /4 | SAL r/m32, 1 | r/m32 を1 bit 左シフトする。。 |
REX.W | D1 /4 | SAL r/m64, 1 | r/m64 を1 bit 左シフトする。。 |
66 | D3 /4 | SAL r/m16, CL | r/m16 をCL bit 左シフトする。。 |
- | D3 /4 | SAL r/m32, CL | r/m32 をCL bit 左シフトする。。 |
REX.W | D3 /4 | SAL r/m64, CL | r/m64 をCL bit 左シフトする。。 |
66 | C1 /4 ib | SAL r/m16, imm8 | r/m16 をimm8 bit 左シフトする。。 |
- | C1 /4 ib | SAL r/m32, imm8 | r/m32 をimm8 bit 左シフトする。。 |
REX.W | C1 /4 ib | SAL r/m64, imm8 | r/m64 をimm8 bit 左シフトする。。 |
SAR
レジスタまたはメモリの内容を指定ビット数右シフトします。最上位ビットは元のbitをコピーします。
表記 : SAR OP1, OP2 ┌─┐ │ ↑ 動作 : OP1 = [ └→□□□□□□□□□□□□□□□□→CF ] を OP2 回繰り返す
プリフィックス | オペコード | 命令 | 説明 |
---|---|---|---|
- | D0 /7 | SAR r/m8, 1 | r/m8 を 1 bit 右シフトする。最上位は元のbitをコピーする。 |
REX | D0 /7 | SAR r/m8, 1 | r/m8 を 1 bit 右シフトする。最上位は元のbitをコピーする。 |
- | D2 /7 | SAR r/m8, CL | r/m8 を CL bit 右シフトする。最上位は元のbitをコピーする。 |
REX | D2 /7 | SAR r/m8, CL | r/m8 を CL bit 右シフトする。最上位は元のbitをコピーする。 |
- | C0 /7 ib | SAR r/m8, imm8 | r/m8 を imm8 bit 右シフトする。最上位は元のbitをコピーする。 |
REX | C0 /7 ib | SAR r/m8, imm8 | r/m8 を imm8 bit 右シフトする。最上位は元のbitをコピーする。 |
66 | D1 /7 | SAR r/m16, 1 | r/m16 を 1 bit 右シフトする。最上位は元のbitをコピーする。 |
- | D1 /7 | SAR r/m32, 1 | r/m32 を 1 bit 右シフトする。最上位は元のbitをコピーする。 |
REX.W | D1 /7 | SAR r/m64, 1 | r/m64 を 1 bit 右シフトする。最上位は元のbitをコピーする。 |
66 | D3 /7 | SAR r/m16, CL | r/m16 を CL bit 右シフトする。最上位は元のbitをコピーする。 |
- | D3 /7 | SAR r/m32, CL | r/m32 を CL bit 右シフトする。最上位は元のbitをコピーする。 |
REX.W | D3 /7 | SAR r/m64, CL | r/m64 を CL bit 右シフトする。最上位は元のbitをコピーする。 |
66 | C1 /7 ib | SAR r/m16, imm8 | r/m16 を imm8 bit 右シフトする。最上位は元のbitをコピーする。 |
- | C1 /7 ib | SAR r/m32, imm8 | r/m32 を imm8 bit 右シフトする。最上位は元のbitをコピーする。 |
REX.W | C1 /7 ib | SAR r/m64, imm8 | r/m64 を imm8 bit 右シフトする。最上位は元のbitをコピーする。 |
SHR
表記 : SHR OP1, OP2 動作 : OP1 = [ 0→□□□□□□□□□□□□□□□□→CF ] を OP2 回繰り返す
プリフィックス | オペコード | 命令 | 説明 |
---|---|---|---|
- | D0 /5 | SHR r/m8,1 | r/m8 を 1 bit 右シフトする。最上位ビットには0が入る。 |
REX | D0 /5 | SHR r/m8,1 | r/m8 を 1 bit 右シフトする。最上位ビットには0が入る。 |
- | D2 /5 | SHR r/m8,CL | r/m8 を CL bit 右シフトする。最上位ビットには0が入る。 |
REX | D2 /5 | SHR r/m8,CL | r/m8 を CL bit 右シフトする。最上位ビットには0が入る。 |
- | C0 /5 ib | SHR r/m8,imm8 | r/m8 を imm8 bit 右シフトする。最上位ビットには0が入る。 |
REX | C0 /5 ib | SHR r/m8,imm8 | r/m8 を imm8 bit 右シフトする。最上位ビットには0が入る。 |
66 | D1 /5 | SHR r/m16,1 | r/m16 を 1 bit 右シフトする。最上位ビットには0が入る。 |
- | D1 /5 | SHR r/m32,1 | r/m32 を 1 bit 右シフトする。最上位ビットには0が入る。 |
REX.W | D1 /5 | SHR r/m64,1 | r/m64 を 1 bit 右シフトする。最上位ビットには0が入る。 |
66 | D3 /5 | SHR r/m16,CL | r/m16 を CL bit 右シフトする。最上位ビットには0が入る。 |
- | D3 /5 | SHR r/m32,CL | r/m32 を CL bit 右シフトする。最上位ビットには0が入る。 |
REX.W | D3 /5 | SHR r/m64,CL | r/m64 を CL bit 右シフトする。最上位ビットには0が入る。 |
66 | C1 /5 ib | SHR r/m16,imm8 | r/m16 を imm8 bit 右シフトする。最上位ビットには0が入る。 |
- | C1 /5 ib | SHR r/m32,imm8 | r/m32 を imm8 bit 右シフトする。最上位ビットには0が入る。 |
REX.W | C1 /5 ib | SHR r/m64, imm8 | r/m64 を imm8 bit 右シフトする。最上位ビットには0が入る。 |
SHLD
2つのレジスタを連結し、内容を指定ビット数左シフトします。最下位ビットには0が入ります。実行後 OP2 の値は変化しません。
表記 : SHLD OP1, OP2, OP3 動作 : OP1 = [ CF←□□□OP1□□□□□←□□□OP2□□□□□ ] OP3 ビットシフトする
プリフィックス | オペコード | 命令 | 説明 |
---|---|---|---|
66 | 0F A4 | SHLD r/m16, r16, imm8 | r/m16 を左に imm8 bit シフトし、r16からのビットを右からシフトインする。 |
- | 0F A4 | SHLD r/m32, r32, imm8 | r/m32 を左に imm8 bit シフトし、r32からのビットを右からシフトインする。 |
REX.W | 0F A4 | SHLD r/m64, r64, imm8 | r/m64 を左に imm8 bit シフトし、r64からのビットを右からシフトインする。 |
66 | 0F A5 | SHLD r/m16, r16, CL | r/m16 を左に CL bit シフトし、r16 からのビットを右からシフトインする。 |
- | 0F A5 | SHLD r/m32, r32, CL | r/m32 を左に CL bit シフトし、r32 からのビットを右からシフトインする。 |
REX.W | 0F A5 | SHLD r/m64, r64, CL | r/m64 を左に CL bit シフトし、r64 からのビットを右からシフトインする。 |
SHRD
2つのレジスタを連結し、内容を指定ビット数右シフトします。最下位ビットには0が入ります。実行後 OP2 の値は変化しません。
表記 : SHLD OP1, OP2, OP3 動作 : OP1 = [ □□□OP1□□□□□→□□□OP2□□□□□ →CF ] OP3 ビットシフトする
プリフィックス | オペコード | 命令 | 説明 |
---|---|---|---|
66 | 0F AC | SHRD r/m16, r16, imm8 | r/m16 を右にimm8 bit シフトし、r16からのビットを左からシフトインする。 |
- | 0F AC | SHRD r/m32, r32, mm8 | r/m32 を右にimm8 bit シフトし、r32からのビットを左からシフトインする。 |
REX.W | 0F AC | SHRD r/m64, r64, imm8 | r/m64 を右にimm8 bit シフトし、r64からのビットを左からシフトインする。 |
66 | 0F AD | SHRD r/m16, r16, CL | r/m16 を右にCL bit シフトし、r16 からのビットを左からシフトインする。 |
- | 0F AD | SHRD r/m32, r32, CL | r/m32 を右にCL bit シフトし、r32 からのビットを左からシフトインする。 |
REX.W | 0F AD | SHRD r/m64, r64, CL | r/m64 を右にCL bit シフトし、r64 からのビットを左からシフトインする。 |
RCL
レジスタのビット列にキャリーを加えて左にローテイトします。
表記 : RCL OP1, OP2 ┌────────────────┐ ↑ ↓ 動作 : OP1 = [ CF←□□□□□□□□□□□□□□□□ ] を OP2 回繰り返す
プリフィックス | オペコード | 命令 | 説明 |
---|---|---|---|
- | D0 /2 | RCL r/m8, 1 | 9 ビット(CF、r/m8)を左に1 bit ローテイト |
REX | D0 /2 | RCL r/m8, 1 | 9 ビット(CF、r/m8)を左に1 bit ローテイト |
- | D2 /2 | RCL r/m8, CL | 9 ビット(CF、r/m8)を左にCL bit ローテイト |
REX | D2 /2 | RCL r/m8, CL | 9 ビット(CF、r/m8)を左にCL bit ローテイト |
- | C0 /2 ib | RCL r/m8, imm8 | 9 ビット(CF、r/m8)を左にimm8 bit ローテイト |
REX | C0 /2 ib | RCL r/m8, imm8 | 9 ビット(CF、r/m8)を左にimm8 bit ローテイト |
66 | D1 /2 | RCL r/m16, 1 | 17 ビット(CF、r/m16)を左に1 bit ローテイト |
- | D1 /2 | RCL r/m32, 1 | 33 ビット(CF、r/m32)を左に1 bit ローテイト |
REX.W | D1 /2 | RCL r/m64, 1 | 65 ビット(CF、r/m64)を左に1 bit ローテイト |
66 | D3 /2 | RCL r/m16, CL | 17 ビット(CF、r/m16)を左にCL bit ローテイト |
- | D3 /2 | RCL r/m32, CL | 33 ビット(CF、r/m32)を左にCL bit ローテイト |
REX.W | D3 /2 | RCL r/m64, CL | 65 ビット(CF、r/m64)を左にCL bit ローテイト |
66 | C1 /2 ib | RCL r/m16, imm8 | 17 ビット(CF、r/m16)を左にimm8 bit ローテイト |
- | C1 /2 ib | RCL r/m32, imm8 | 33 ビット(CF、r/m32)を左にimm8 bit ローテイト |
REX.W | C1 /2 ib | RCL r/m64, imm8 | 65 ビット(CF、r/m64)を左にimm8 bit ローテイト |
RCR
レジスタのビット列にキャリーを加えて右にローテイトします。
表記 : RCR OP1, OP2 ┌────────────────┐ ↓ ↑ 動作 : OP1 = [ □□□□□□□□□□□□□□□□→CF ] を OP2 回繰り返す
プリフィックス | オペコード | 命令 | 説明 |
---|---|---|---|
- | D0 /3 | RCR r/m8, 1 | 9 ビット(CF、r/m8)を右に1 bit ローテイト |
REX | D0 /3 | RCR r/m8, 1 | 9 ビット(CF、r/m8)を右に1 bit ローテイト |
- | D2 /3 | RCR r/m8, CL | 9 ビット(CF、r/m8)を右にCL bit ローテイト |
REX | D2 /3 | RCR r/m8, CL | 9 ビット(CF、r/m8)を右にCL bit ローテイト |
- | C0 /3 ib | RCR r/m8, imm8 | 9 ビット(CF、r/m8)を右にimm8 bit ローテイト |
REX | C0 /3 ib | RCR r/m8, imm8 | 9 ビット(CF、r/m8)を右にimm8 bit ローテイト |
66 | D1 /3 | RCR r/m16, 1 | 17 ビット(CF、r/m16)を右に1 bit ローテイト |
- | D1 /3 | RCR r/m32, 1 | 33 ビット(CF、r/m32)を右に1 bit ローテイト |
REX.W | D1 /3 | RCR r/m64, 1 | 65 ビット(CF、r/m64)を右に1 bit ローテイト |
66 | D3 /3 | RCR r/m16, CL | 17 ビット(CF、r/m16)を右にCL bit ローテイト |
- | D3 /3 | RCR r/m32, CL | 33 ビット(CF、r/m32)を右にCL bit ローテイト |
REX.W | D3 /3 | RCR r/m64, CL | 65 ビット(CF、r/m64)を右にCL bit ローテイト |
66 | C1 /3 ib | RCR r/m16, imm8 | 17 ビット(CF、r/m16)を右にimm8 bit ローテイト |
- | C1 /3 ib | RCR r/m32, imm8 | 33 ビット(CF、r/m32)を右にimm8 bit ローテイト |
REX.W | C1 /3 ib | RCR r/m64, imm8 | 65 ビット(CF、r/m64)を右にimm8 bit ローテイト |
ROL
レジスタのビット列を左にローテイトします。キャリーは使用しません。このローテイト命令は右シフトと左シフトをORすることでも実現できます。
表記 : ROL OP1, OP2 ┌──────────────┐ ↑ ↓ 動作 : OP1 = [ □□□□□□□□□□□□□□□□ ] を OP2 回繰り返す ←
プリフィックス | オペコード | 命令 | 説明 |
---|---|---|---|
- | D0 /0 | ROL r/m8, 1 | 8 ビット r/m8 を左に1 bit ローテイト |
REX | D0 /0 | ROL r/m8, 1 | 8 ビット r/m8 を左に1 bit ローテイト |
- | D2 /0 | ROL r/m8, CL | 8 ビット r/m8 を左にCL bit ローテイト |
REX | D2 /0 | ROL r/m8, CL | 8 ビット r/m8 を左にCL bit ローテイト |
- | C0 /0 ib | ROL r/m8, imm8 | 8 ビット r/m8 を左にimm8 bit ローテイト |
REX | C0 /0 ib | ROL r/m8, imm8 | 8 ビット r/m8 を左にimm8 bit ローテイト |
66 | D1 /0 | ROL r/m16, 1 | 16 ビット r/m16 を左に1 bit ローテイト |
- | D1 /0 | ROL r/m32, 1 | 32 ビット r/m32 を左に1 bit ローテイト |
REX.W | D1 /0 | ROL r/m64, 1 | 64 ビット r/m64 を左に1 bit ローテイト |
66 | D3 /0 | ROL r/m16, CL | 16 ビット r/m16 を左にCL bit ローテイト |
- | D3 /0 | ROL r/m32, CL | 32 ビット r/m32 を左にCL bit ローテイト |
REX.W | D3 /0 | ROL r/m64, CL | 64 ビット r/m64 を左にCL bit ローテイト |
66 | C1 /0 ib | ROL r/m16, imm8 | 16 ビット r/m16 を左にimm8 bit ローテイト |
- | C1 /0 ib | ROL r/m32, imm8 | 32 ビット r/m32 を左にimm8 bit ローテイト |
REX.W | C1 /0 ib | ROL r/m64, imm8 | 64 ビット r/m64 を左にimm8 bit ローテイト |
ROR
レジスタのビット列を右にローテイトします。キャリーは使用しません。このローテイト命令は右シフトと左シフトをORすることでも実現できます。
表記 : ROR OP1, OP2 ┌──────────────┐ ↓ ↑ 動作 : OP1 = [ □□□□□□□□□□□□□□□□ ] を OP2 回繰り返す →
プリフィックス | オペコード | 命令 | 説明 |
---|---|---|---|
- | D0 /1 | ROR r/m8, 1 | 8 ビット r/m8 を右に1 bit ローテイト |
REX | D0 /1 | ROR r/m8, 1 | 8 ビット r/m8 を右に1 bit ローテイト |
- | D2 /1 | ROR r/m8, CL | 8 ビット r/m8 を右にCL bit ローテイト |
REX | D2 /1 | ROR r/m8, CL | 8 ビット r/m8 を右にCL bit ローテイト |
- | C0 /1 ib | ROR r/m8, imm8 | 8 ビット r/m16 を右にimm8 bit ローテイト |
REX | C0 /1 ib | ROR r/m8, imm8 | 8 ビット r/m16 を右にimm8 bit ローテイト |
- | D1 /1 | ROR r/m16, 1 | 16 ビット r/m16 を右に1 bit ローテイト |
- | D1 /1 | ROR r/m32, 1 | 32 ビット r/m32 を右に1 bit ローテイト |
REX.W | D1 /1 | ROR r/m64, 1 | 64 ビット r/m64 を右に1 bit ローテイト |
66 | D3 /1 | ROR r/m16, CL | 16 ビット r/m16 を右にCL bit ローテイト |
- | D3 /1 | ROR r/m32, CL | 32 ビット r/m32 を右にCL bit ローテイト |
REX.W | D3 /1 | ROR r/m64, CL | 64 ビット r/m64 を右にCL bit ローテイト |
66 | C1 /1 ib | ROR r/m16, imm8 | 16 ビット r/m16 を右にimm8 bit ローテイト |
- | C1 /1 ib | ROR r/m32, imm8 | 32 ビット r/m32 を右にimm8 bit ローテイト |
REX.W | C1 /1 ib | ROR r/m64, imm8 | 64 ビット r/m64 を右にimm8 bit ローテイト |