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