SIBバイト
読み:エスアイビー-バイト
外語:SIB byte

 x86の機械語コード中にあり、実効アドレスを指定したメモリーアクセスをする際の情報を与えるためのバイト。i386の32ビット以降で追加された。
目次

概要
 32ビットモードでのアドレッシングの場合、インデックスを使った実効アドレス指定は、ModR/Mだけでは出来ない。そこでこのような場合は、ModR/Mの直後にSIBバイトが置かれる。
 ModR/Mの各モードごとにR/Mフィールドを100とすると、SIBを使用してアドレスの参照方法を指定できる。
76543210
ScaleフィールドIndexフィールドBaseフィールド
 これを組み合わせることで、[eax+edx*4+10]といったような実効アドレスを指定し、メモリアクセスをすることができる。
 この例の場合、eaxがBase、edxがIndex、4がScaleということになる。

特徴

Base
 ベースアドレスを指定するレジスターを指定するフィールドである。
 ModR/MのModフィールドによって、baseの解釈が変わる。
 64ビットでは、レジスター数が倍となり表現に4ビットを要するため、4ビット目はREXプリフィックスのREX.bで表わす。
 レジスターはロングモード(64ビット)でのものを記載しているが、32ビットでも(R8から15が無いことを除けば)同様である。
 mod
rex.bbase000110
0000RAXRAX + disp8RAX + disp32
001RCXRCX + disp8RCX + disp32
010RDXRDX + disp8RDX + disp32
011RBXRBX + disp8RBX + disp32
100RSPRSP + disp8RSP + disp32
101disp32RBP + disp8RBP + disp32
110RSIRSI + disp8RSI + disp32
111RDIRDI + disp8RDI + disp32
1000R8R8 + disp8R8 + disp32
001R9R9 + disp8R9 + disp32
010R10R10 + disp8R10 + disp32
011R11R11 + disp8R11 + disp32
100R12R12 + disp8R12 + disp32
101disp32R13 + disp8R13 + disp32
110R14R14 + disp8R14 + disp32
111R15R15 + disp8R15 + disp32
 Mod=00の場合、ベースを指定する時はディスプレイスメントは指定できないが、ベースレジスター無し(base=101)を指定する場合)はディスプレースメントが必須である。ベースもディスプレースメントも無い、という指定は出来ない。
 Mod=01またはMod=10の場合、ベースなしという指定は出来ず、またディスプレースメントが必須となる。

Index
 インデックスレジスターを指定するための3ビットのフィールドである。
 32ビットでは、rex.x=0のレジスターのみが使える。
 64ビットでは、レジスター数が倍となり表現に4ビットを要するため、4ビット目はREXプリフィックスのREX.xで表わす。
rex.xindexレジスター
0000RAX
001RCX
010RDX
011RBX
100RSP
101RBP
110RSI
111RDI
1000R8
001R9
010R10
011R11
100R12
101R13
110R14
111R15

Scale
 インデックスレジスターの倍率を指定するフィールドである。
scale倍率
00なし
012
104
118

再検索