在X86 32位架构下,指令格式定义中,新增了SIB字节。SIB(Scale, Index, Base)字节的意义是用于指定一种复杂的寻址方式(按比例变址寻址),在《CPU寄存器与寻址方式》中已经介绍过了。
ModR/M字节具体值,组成情况,如下图所示。

上表查询方法,已在8086 CPU章节介绍过,不再赘述。
把表格中每一类寻址方式,都举一个例子,进行描述,如下:
| 序号 | 寻址方式 | Mod | R/M | 汇编例子 | 含义 | 机器码转换 |
|---|---|---|---|---|---|---|
| 1 | disp32 | 00 | 101 | mov ecx,[00000100h] | (ecx)=(00000100h):表示将地址00000100h,指向的内存单元,存储到ecx寄存器中。 | 参考8086 CPU |
| 2 | [EAX] | 00 | 000 | mov ecx,[eax] | (ecx)=((eax)):表示将eax寄存器中地址,指向的内存单元,存储到ecx寄存器中。 | 参考8086 CPU |
| 3 | [- -][- -] | 00 | 100 | mov ecx,[eax+ebx*2] | (ecx)=((eax)+(ebx) * 2):表示将eax寄存器中地址+ebx寄存器中地址*2,指向的内存单元,存储到ecx寄存器中。 | SIB寻址 |
| 4 | disp8[EAX] | 01 | 000 | mov ecx,[eax+10h] | (ecx)=((eax)+10h):表示将eax寄存器中地址+10h,指向的内存单元,存储到ecx寄存器中。 | 参考8086 CPU |
| 5 | disp8[- -][- -] | 01 | 100 | mov ecx,[eax+ebx*2+10h] | (ecx)=((eax)+(ebx) * 2+10h):表示将eax寄存器中地址+ebx寄存器中地址*2+10h,指向的内存单元,存储到ecx寄存器中。 | SIB寻址 |
| 6 | disp32[EAX] | 10 | 000 | mov ecx,[eax+00000100h] | (ecx)=((eax)+00000100h):表示将eax寄存器中地址+00000100h,指向的内存单元,存储到ecx寄存器中。 | 参考8086 CPU |
| 7 | disp32[- -][- -] | 10 | 100 | mov ecx,[eax+ebx*2+00000100h] | (ecx)=((eax)+(ebx) * 2+00000100h):表示将eax寄存器中地址+ebx寄存器中地址*2+00000100h,指向的内存单元,存储到ecx寄存器中。 | SIB寻址 |
在32位X86架构下,内存寻址,不需要段地址作为基址,这与16位8086有区别,需要注意。
本文主要对32位架构下,新增的寻址方式,进行讲解。这些寻址方式中,我们主要讲解[- -][- -]、disp8[- -][- -]、disp32[- -][- -]三种,本质其实他们属于一种,都是SIB寻址。
mov ecx,[eax+ebx*2],表示将eax寄存器中地址+ebx寄存器中地址*2,指向的内存单元,存储到ecx寄存器中。
查询指令手册,与MOV r32,r/m32指令相符,其操作码为8B /r,/r表示这条指令具有ModR/M字段。

因此,我们查询ModR/M表,以[- -][- -]为行,以ecx为列,交汇处0C表示ModR/M值。
我们回顾一下机器码的组成,如下图所示:

当前指令不存在Instruction Prefixes、Displacement和Immediate,我们已经知晓Opcode和ModR/M,因此还需要查询SIB。
指令中[eax+ebx*2],其含义如下:

因此Scale为2,Index为ebx,Base为eax,无Displacement,我们查询SIB表,如下:

以Scale和Index为行(ebx*2),以Base为列(eax),交汇处58表示SIB值(Scale=01,Index=011,Base=000)。
因此指令的机器码组成,如下所示:
| 汇编指令 | 操作码 | ModR/M | SIB | 机器码 |
|---|---|---|---|---|
| mov ecx,[eax+ebx*2] | 8B | 0C | 58 | 8B0C58 |
mov ecx,[eax+ebx*2+10h],表示将eax寄存器中地址+ebx寄存器中地址*2+10h,指向的内存单元,存储到ecx寄存器中。
查询指令手册,与MOV r32,r/m32指令相符,其操作码为8B /r,/r表示这条指令具有ModR/M字段。
我们查询ModR/M表,以disp8[- -][- -]为行,以ecx为列,交汇处4C表示ModR/M值。

因此Scale为2,Index为ebx,Base为eax,Displacement为10h,我们查询SIB表,以Scale和Index为行(ebx*2),以Base为列(eax),交汇处58表示SIB值。
因此指令的机器码组成,如下所示:
| 汇编指令 | 操作码 | ModR/M | SIB | 偏移 | 机器码 |
|---|---|---|---|---|---|
| mov ecx,[eax+ebx*2+10h] | 8B | 4C | 58 | 10 | 8B4C5810 |
mov ecx,[eax+ebx*2+00000100h],表示将eax寄存器中地址+ebx寄存器中地址*2+00000100h,指向的内存单元,存储到ecx寄存器中。
查询指令手册,与MOV r32,r/m32指令相符,其操作码为8B /r,/r表示这条指令具有ModR/M字段。
我们查询ModR/M表,以disp32[- -][- -]为行,以ecx为列,交汇处8C表示ModR/M值。

因此Scale为2,Index为ebx,Base为eax,Displacement为00000100h,我们查询SIB表,以Scale和Index为行(ebx*2),以Base为列(eax),交汇处58表示SIB值。
因此指令的机器码组成,如下所示:
| 汇编指令 | 操作码 | ModR/M | SIB | 偏移 | 机器码 |
|---|---|---|---|---|---|
| mov ecx,[eax+ebx*2+00000100h] | 8B | 8C | 58 | 00000100 | 8B8C5800010000 |