繁体   English   中英

为什么我不能在 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]这样的寻址模式?

看一下编码

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM