为什么我不能在 8086 中同时使用 SI 和 DI 或者 BX 和 BP 寄存器进行间接寻址?

Why can't I use both SI and DI or BX and BP registers with indirect addresing in 8086?

我知道它们是唯一可以用于间接寻址的寄存器,但我找不到解释为什么我不能同时使用这些对的原因。

为什么机器不支持[si+di]这样的寻址方式?

看看the encoding

大多数 8086 指令有两个操作数,一个必须是寄存器,另一个可以是寄存器或内存操作数 (r/m)。 8086 使用称为 ModRM 字节的一个字节来指定操作数。其中的 3 位是 reg 字段,它指定 8 个 general-purpose 寄存器中的哪一个构成寄存器操作数。 2 位是 mod 字段,select 无论 r/m 操作数是寄存器,还是无位移、8 位位移或 16 位位移的内存操作数。剩下的三位是 r/m 字段。所以你已经看到只有 8 种寄存器组合是可能的。

r/m 字段的高位 select 是否使用 one-register 或 two-register 寻址模式。因此,如果 two-register 被 selected,我们还剩下两位到 select 这两个寄存器,所以只有四种组合是可能的。它们的编码方式是让两个位 select 中的较高位 select 为 BX 或 BP,而较低位 select 为 SI 或 DI。这导致了你所知道的四种组合。低位不能同时为0和1,所以不能同时有SI和DI。

别忘了 8086 及其指令编码是在 70 年代后期设计的。如果设计者想要提供更大的灵活性,他们将不得不使用一种更复杂的编码方案,一个字节都放不下。这意味着代码会更大(memory cost about ,000 per megabyte in 1978) and the CPU would need more transistors (the 8086 had only 29,000),从而增加所有方面的成本。

1985年32位的80386发布时,确实有更灵活的寻址方式;添加了另一个字节(SIB 字节),它允许在有效地址中使用一个或两个 general-purpose 寄存器的任意组合,并对其中一个应用可选的移位。然而,386 的晶体管数量是 8086 的 10 倍,内存价格在其间的 7 年中下降了约 50 倍。