2016-06-15 49 views

回答

2

是的,现代微体系结构中的乱序核心运行基本相同,无论模式为。大部分的区别在于解码器。请参阅Agner Fog's microarch pdf标记wiki中的其他链接,了解现代CPU实际在内部工作的详细信息。

它可能需要额外的硅在16位模式下表现不同,因为它非常类似于32位模式寻呼禁用,但使用不同的默认地址尺寸和操作数大小。

我读过,AMD的CPU是稍微慢一些,当段具有非零基地。 (或者我想在16位模式:当段寄存器本身设置为非零值,因为在16位模式,他们直接使用,而不是被选择用于描述符)


记住many common 16bit idioms like loop are terrible

此外,局部寄存器放缓可以轻松地与乱序执行干扰,如果你不小心。英特尔P6系列和SnB系列CPU分别对部分寄存器进行重命名,因此写入AX不会错误地依赖EAX/RAX的全部内容。在SnB之前在CPU上稍后合并时可能会出现停顿,或者在Haswell之前仅在SnB上出现轻微减速。

所有其他微体系结构的治疗mov ax, 5eax读 - 修改 - 写,所以它不会打破的ax旧值依赖链。如果你不小心,这可能是无序执行的一个大问题。

阅读昂纳雾手册,以了解更多信息。

16位寻址模式可能表现不好,我忘了。 32位代码不需要它们很快,64位代码根本不能使用16位地址。 (在64位代码中的地址大小前缀意味着地址大小= 32位。)


VEX编码指令(包括BMI2整数指令like pext)不是在实模式下可用。 This Intel forum topic表明可能是由于现有软件(NTVDM)使用机器码作为陷阱进入保护模式。 (即与VEX使用的LDS/LES相同的非法操作数)。使VEX编码的指令仍然生成#UD因此对于向后兼容性是重要的。

SSE仍处于实模式下可用,不过,if you enable it with the right CR setting

+1

时,即使我已经知道这个问题的答案,我总是会从阅读你的答案中学到很多东西。 :)例如,我不知道VEX编码指令在实模式下不可用。 –

+0

@CodyGray:如果答案没有超出相关信息的范围,那么这将是一个相当无聊的地方:D。我一直想深入了解为什么一些指令在实时模式下暂时不可用。指令集手册记录了某些BMI/BMI2整数指令的事实,但不适用于像“VPBLENDD”这样的AVX2指令。直到在写这个答案时终于搜索,我才确定。我想知道它是否与16位操作数大小无关,忽略操作数大小前缀与需要晶体管。 –

+1

0xc4 0xc4 0x60(Vm版本号)和0xc4,0xc4,0x58在NTVDM之前在90年代中期在16位代码中很常见。他们通常被我们这些人用来确定我们是否在SoftPC中运行。当时他们被稀疏地记录为BOP代码。在90年代中期,微软用NT设备驱动程序套件半记录了它们。这并不令人惊讶,因为NTVDM基于SoftPC。我拿出旧的NT DDK CD,可以在文件ISVBOP.h中找到它们。 –

相关问题