Поле R/O (биты 5– 3) содержит либо дополнительные три бита кода команды, либо код операнда, который может быть только регистром. Будем обозначать второй случай reg, а в первом записывать используемые биты.
Поля MOD (биты 7 – 6) и R/M (биты 3 – 0) определяют операнд, который может быть как регистром, так и переменной в памяти:
MOD = 11, если используется регистровая адресация и R/M содержит код регистра reg;
MOD = 00, если используется адресация без смещения ([ВХ + SI] или [EDX]);
MOD = 01, если используется адресация с 8-битным смещением (variable[BX + SI]);
MOD = 10, если используется адресация с 16- или 32-битным смещением.
Значение поля R/M различно в 16- и 32-битных режимах.
R/M в 16-битном режиме:
000 — [ВХ + SI]
001 — [ВХ + DI]
010 — [BP + SI]
011 — [ВР + DI]
100 — [SI]
101 — [DI]
110 — [ВР] (кроме MOD = 00 — в этом случае после ModR/M располагается 16-битное смещение, то есть используется прямая адресация)
111 — [ВХ]
R/M в 32-битном режиме:
000 — [ЕАХ]
001 — [ЕСХ]
010 — [EDX]
011 — [ЕВХ]
100 — используется SIB
101 — [ЕВР] (кроме MOD = 00 — в этом случае используется SIB, после которого располагается 32-битное смещение)
110 — [ESI]
111 — [EDI]