8086/8088上的Effective Address计算时间

Effective Address calculation time on 8086/8088

我已经开始实施 8086/8088,目标是精确循环。我能理解大多数指令的时钟周期数背后的原因,但是我必须说我对有效地址 (EA) 计算时间感到非常困惑。

更具体地说,为什么计算 BP + DI 或 BX + SI 需要 7 个周期,而计算 BP + SI 或 BX + DI 需要 8 个周期?

我可以等待给定的周期数,但我真的很想知道为什么会有这个 1 个周期的差异(以及为什么做任何 EA 计算需要这么多周期,因为 EA 使用计算地址的ALU,寄存器间ADD只需3个周期)。

如果不对芯片进行逆向工程,我认为无法解释 [BP + SI] 和 [BP + DI] 之间的周期差异。 (请注意,有人已经或将要进行必要的逆向工程并非完全没有问题,已经对 Commodore 64 中的某些芯片进行了逆向工程,以创建更精确的仿真器。)然而,这很容易解释为什么有效地址计算通常需要这么长时间。原因是 [BX + SI] 的计算实际上是 DS * 16 + BX + SI,所以它是两个加法,而不仅仅是一个。同样是20位计算,ALU只有16位宽,所以需要多加一次add才能计算出物理地址的高20位。这是等效的三个寄存器到寄存器相加,总共花费 9 个周期,并假设 4 位移位是免费的,因此 EA 计算实际上比等效指令更快。