关于 16 位程序在 32 位系统中运行速度较慢,我可以告诉你。
当 Intel 从 16 位到 32 位时,他们不得不扩展指令集以应对新的 32 位寄存器,但要保持与 16 位程序的二进制兼容性。
为了实现这一点,他们添加了一个前缀 66h,如果我没记错的话,当应用于任何使用 16 位寄存器的指令时,会使该指令使用 32 位寄存器。
例如,一个 16 位指令,如 MOV AX,BX,以 66h 为前缀,变成 MOV EAX,EBX
但这会对新的 32 位指令施加惩罚,因为它们至少需要一个额外的内存获取周期才能执行。英特尔随后创建了所谓的 32 位段和 16 位段。
基本上,任何一段代码都必须驻留在代码段中。在80386之前,所有段都使用16位指令,并且假设所有指令都使用16位寄存器。
Intel 的 32-segment 也包含代码,但是这次假设每条指令都使用 32 位寄存器,所以在 32 位段中,MOV EAX,EBX 的操作码与 MOV AX 的操作码相同, 16 位段中的 BX。
这允许程序不必为每条 32 位指令使用 66h 前缀。不再有任何处罚。
但是...如果我必须在包含在 32 位段中的程序中使用 16 位寄存器怎么办?那些使用 16 位寄存器的指令必须使用前缀 66h。
所以:使用 16 位寄存器的指令在 16 位段中没有前缀,在 32 位段中没有前缀。使用 32 位寄存器的指令在 32 位段中不加前缀,在 16 位段中加前缀。
此外:从 Pentium 处理器开始,我们有两条用于并行执行指令的管道。要使用这些管道,进入它们的指令必须属于 Intel 命名的“RISC 核”:指令的子集,不再作为 CPU 内部的微程序执行,而是使用有线逻辑。你猜怎么了?带前缀的指令和使用 16 位寄存器在 16 位段中执行的代码不属于该组,因此不能与另一组并行执行。当一条带前缀的指令成功进入其中一条流水线时,另一条流水线就会停止,从而影响 CPU 的性能。