有效地址计算时间为8086/8088

Mat*_*iez 5 x86 assembly cpu-architecture x86-16

我已经开始实现8086/8088,其目标是完全循环.我可以理解大多数指令的时钟周期数背后的原因,但我必须说我对有效地址(EA)计算时间感到困惑.

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

我可以等待一定数量的周期,但我真的很想知道为什么存在这种1周期差异(以及为什么需要这么多周期才能进行任何EA计算,因为EA使用ALU来计算地址,寄存器之间的ADD只有3个周期).

Ros*_*dge 4

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

  • 我记得当时(80 年代中后期)人们是这么告诉我的。英特尔处理器直到 80286 才获得专门的硬件来实现这一点,它可以在一两个周期内完成 24 位地址计算。 (3认同)
  • Reddit 上还提出了对周期数差异的可能解释:如果 BP 和 SI 在(单端口)寄存器文件中,而 BX 和 DI 在另一个寄存器文件中,就会发生这种情况。链接:https://www.reddit.com/r/programming/comments/33q4ff/ effective_address_calculation_time_on_80868088/ (2认同)