シフト/ローテイト命令

シフト命令はビット操作、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 ローテイト

続く...


このページの目次