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

daw*_*cha -1 assembly cpu-architecture addressing-mode x86-16

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

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

Nat*_*dge 8

看一下编码

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

r/m 字段的高位选择是使用一寄存器还是二寄存器寻址模式。因此,如果选择两个寄存器,我们还剩下两位来选择哪两个寄存器,因此只能有四种组合。它们的编码方式是让两位中的较高位选择 BX 或 BP,较低位选择 SI 或 DI。这就引出了您所知道的四种组合。低位不能同时为0和1,因此SI和DI不能同时存在。

不要忘记 8086 及其指令编码是在 20 世纪 70 年代末设计的。如果设计者想要提供更大的灵活性,他们将不得不使用一种更复杂的编码方案,而这种方案无法容纳在一个字节中。这意味着代码会更大(1978 年,内存成本约为每兆字节 20,000 美元),CPU 需要更多晶体管(8086 只有 29,000个),从而增加了成本。

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