Memory 为什么在x86操作系统上运行16位程序会变慢?

Memory 为什么在x86操作系统上运行16位程序会变慢?,memory,memory-management,assembly,Memory,Memory Management,Assembly,我正在研究一些关于汇编的东西,以及我正在阅读的材料,作者说在x86操作系统上编译的16位程序旋转得更慢,在x64上也是如此,32位编译的程序在x64上运行得更慢 为什么会发生这种情况? 计算机内存和处理器中会发生什么情况,使得16位或32位的程序分别在32位和64位中旋转得更慢?我不确定你所说的旋转(组装操作?)是什么意思,但通常这里可能有几个因素- CPU公司并不真正致力于支持旧的遗留模式和ISA子集。x87就是一个很好的例子,任何不需要这种精度的东西最好使用SSE/AVX来完成性能关键任务,

我正在研究一些关于汇编的东西,以及我正在阅读的材料,作者说在x86操作系统上编译的16位程序旋转得更慢,在x64上也是如此,32位编译的程序在x64上运行得更慢

为什么会发生这种情况?
计算机内存和处理器中会发生什么情况,使得16位或32位的程序分别在32位和64位中旋转得更慢?

我不确定你所说的旋转(组装操作?)是什么意思,但通常这里可能有几个因素-

  • CPU公司并不真正致力于支持旧的遗留模式和ISA子集。x87就是一个很好的例子,任何不需要这种精度的东西最好使用SSE/AVX来完成性能关键任务,而不仅仅是因为矢量化

  • 每当x86CPU公司增加寄存器大小时,他们都会保留旧的寄存器集,只为较长的版本添加逻辑名称。兼容性的需要要求旧的操作仍然可以在相同的寄存器上工作,因此现在可以在同一个程序中写入ah/al、ax、eax和rax。在某些情况下(即8位/16位部分),这种兼容性要求CPU在只写入寄存器的下部时保持寄存器的上部完整,这样做会隐式引入合并操作,这可能会导致速度减慢。更糟糕的是,您可能会引入错误的依赖项,因为对16位寄存器的每次写入都需要合并早期操作留下的上半部分


  • 另请参见此处-

    我不确定您所说的旋转(装配操作?)是什么意思,但通常这里可能有几个因素-

  • CPU公司并不真正致力于支持旧的遗留模式和ISA子集。x87就是一个很好的例子,任何不需要这种精度的东西最好使用SSE/AVX来完成性能关键任务,而不仅仅是因为矢量化

  • 每当x86CPU公司增加寄存器大小时,他们都会保留旧的寄存器集,只为较长的版本添加逻辑名称。兼容性的需要要求旧的操作仍然可以在相同的寄存器上工作,因此现在可以在同一个程序中写入ah/al、ax、eax和rax。在某些情况下(即8位/16位部分),这种兼容性要求CPU在只写入寄存器的下部时保持寄存器的上部完整,这样做会隐式引入合并操作,这可能会导致速度减慢。更糟糕的是,您可能会引入错误的依赖项,因为对16位寄存器的每次写入都需要合并早期操作留下的上半部分


  • 另请参见此处-

    我不确定您所说的旋转(装配操作?)是什么意思,但通常这里可能有几个因素-

  • CPU公司并不真正致力于支持旧的遗留模式和ISA子集。x87就是一个很好的例子,任何不需要这种精度的东西最好使用SSE/AVX来完成性能关键任务,而不仅仅是因为矢量化

  • 每当x86CPU公司增加寄存器大小时,他们都会保留旧的寄存器集,只为较长的版本添加逻辑名称。兼容性的需要要求旧的操作仍然可以在相同的寄存器上工作,因此现在可以在同一个程序中写入ah/al、ax、eax和rax。在某些情况下(即8位/16位部分),这种兼容性要求CPU在只写入寄存器的下部时保持寄存器的上部完整,这样做会隐式引入合并操作,这可能会导致速度减慢。更糟糕的是,您可能会引入错误的依赖项,因为对16位寄存器的每次写入都需要合并早期操作留下的上半部分


  • 另请参见此处-

    我不确定您所说的旋转(装配操作?)是什么意思,但通常这里可能有几个因素-

  • CPU公司并不真正致力于支持旧的遗留模式和ISA子集。x87就是一个很好的例子,任何不需要这种精度的东西最好使用SSE/AVX来完成性能关键任务,而不仅仅是因为矢量化

  • 每当x86CPU公司增加寄存器大小时,他们都会保留旧的寄存器集,只为较长的版本添加逻辑名称。兼容性的需要要求旧的操作仍然可以在相同的寄存器上工作,因此现在可以在同一个程序中写入ah/al、ax、eax和rax。在某些情况下(即8位/16位部分),这种兼容性要求CPU在只写入寄存器的下部时保持寄存器的上部完整,这样做会隐式引入合并操作,这可能会导致速度减慢。更糟糕的是,您可能会引入错误的依赖项,因为对16位寄存器的每次写入都需要合并早期操作留下的上半部分


  • 另请参见此处-

    关于在32位系统中运行较慢的16位程序,我可以告诉您这一点。 当Intel从16位变为32位时,他们必须扩展指令集以适应新的32位寄存器,但要保持与16位程序的二进制兼容性

    为了实现这一点,他们添加了一个前缀66h(如果我记得很清楚的话),当应用于任何使用16位寄存器的指令时,使该指令使用32位寄存器

    例如,一条16位指令,如MOV AX,BX,前缀为66h,会变成MOV EAX,EBX

    但这会对新的32位指令造成惩罚,因为它们至少需要额外的内存提取周期才能执行。英特尔