Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 为什么x86丑陋?为什么与其他人相比,它被认为是低劣的?_Assembly_X86_Mips_X86 64_Cpu Architecture - Fatal编程技术网

Assembly 为什么x86丑陋?为什么与其他人相比,它被认为是低劣的?

Assembly 为什么x86丑陋?为什么与其他人相比,它被认为是低劣的?,assembly,x86,mips,x86-64,cpu-architecture,Assembly,X86,Mips,X86 64,Cpu Architecture,我一直在阅读一些SO归档文件,并遇到了针对x86体系结构的声明 说 “PC架构一团糟,任何操作系统开发人员都会告诉你。” ()说 “认识到x86架构最糟糕的一面” 说 “大多数大学教授MIPS之类的汇编语言,因为它更容易理解,x86汇编语言真的很难看” 还有更多类似的评论 我试着搜索,但没有找到任何原因。我不认为x86不好,可能是因为这是我唯一熟悉的体系结构 有人能告诉我为什么认为x86与其他人相比丑陋/糟糕/低劣。可能的原因有: x86是一个相对古老的系统(它的前身毕

我一直在阅读一些SO归档文件,并遇到了针对x86体系结构的声明


  • “PC架构一团糟,任何操作系统开发人员都会告诉你。”

  • ()说
    “认识到x86架构最糟糕的一面”


  • “大多数大学教授MIPS之类的汇编语言,因为它更容易理解,x86汇编语言真的很难看”

还有更多类似的评论

我试着搜索,但没有找到任何原因。我不认为x86不好,可能是因为这是我唯一熟悉的体系结构


有人能告诉我为什么认为x86与其他人相比丑陋/糟糕/低劣。

可能的原因有:

  • x86是一个相对古老的系统(它的前身毕竟是8086)
  • x86已经发展了好几次,但需要硬件来保持与旧二进制文件的向后兼容性。例如,现代x86硬件仍然支持以本机方式运行16位代码。此外,存在几种内存寻址模型,允许旧代码在同一处理器上交互操作,例如实模式、保护模式、虚拟8086模式和(amd64)长模式。这可能会让一些人感到困惑
  • x86是一台CISC机器。在很长一段时间内,这意味着它比MIPS或ARM等RISC机器慢,因为指令已经使得大多数形式的指令级并行难以实现。现代实现将x86指令转换为类似RISC的指令,称为“隐藏”,以使这些类型的优化在硬件中实现
  • 在某些方面,x86并不逊色,它只是与众不同。例如,在绝大多数体系结构上,输入/输出都作为内存映射进行处理,但在x86上则不是。(注意:现代x86机器通常具有某种形式的支持,并通过内存映射与其他硬件进行通信;但仍然具有类似于
    输入
    输出
    的I/O指令)
  • x86有很少的体系结构寄存器,这可以迫使程序在内存中进行更频繁的往返。执行此操作所需的额外指令占用了可用于有用工作的执行资源,但保持了较低的延迟。将寄存器重命名为大型物理寄存器文件的现代实现可以保留许多指令,但缺少体系结构寄存器仍然是32位x86的一个显著弱点。x86-64从8个整数和向量寄存器增加到16个整数和向量寄存器是64位代码快于32位(以及更高效的寄存器调用ABI)的最大因素之一,而不是每个寄存器宽度的增加。从16个整数寄存器进一步增加到32个整数寄存器会有一些帮助,但没有那么多。(不过,AVX512确实增加到32个向量寄存器,因为浮点代码具有更高的延迟,并且通常需要更多常量。)
  • x86汇编代码很复杂,因为x86是一个具有许多特性的复杂体系结构。典型MIPS机器的指令列表可以放在一张字母大小的纸上。x86的等效清单占据了好几页,而指令只做了更多的工作,因此您通常需要一个比清单所能提供的更大的解释。例如,需要一个相对较大的C代码块来描述它的功能:

    if (DF==0) 
      *(byte*)DI++ = *(byte*)SI++; 
    else 
      *(byte*)DI-- = *(byte*)SI--;
    
    这是一条执行加载、存储和两个加法或减法(由标志输入控制)的指令,每个指令都是RISC机器上的独立指令

    虽然MIPS(和类似的体系结构)的简单性并不一定使其优越,但对于讲授汇编程序入门课程来说,从一个更简单的开始是有意义的。有些汇编类教授x86的一个超简化子集,称为,它的简化程度超出了对实际使用没有用处的程度(例如,没有移位指令),或者有些只教授基本的x86指令

  • x86使用可变长度操作码,这增加了指令解析的硬件复杂性。在现代,随着CPU越来越受到内存带宽的限制而不是原始计算的限制,这种成本变得越来越小,但许多“抨击x86”的文章和态度都来自一个成本相对更高的时代。
    2016年更新:Anandtech发布了一份报告


  • 编辑:这不应该是x86的bash!聚会。考虑到问题的措辞,我别无选择,只能做一些抨击。但除了(1)之外,所有这些事情都是有充分理由的(见评论)。英特尔的设计师并不愚蠢——他们想用自己的体系结构实现一些东西,这些是他们为了实现这些东西而必须支付的一些税费。

    我不是专家,但似乎人们不喜欢它的许多特性可能是它性能好的原因。几年前,拥有寄存器(而不是堆栈)、寄存器帧等被视为使体系结构看起来更简单的好解决方案。然而,如今,重要的是缓存性能,x86的可变长度字允许它在缓存中存储更多的指令。我相信反对者指出的“指令解码”曾经占据了芯片的一半,但现在已经不是这样了

    我认为并行性是当今最重要的因素之一——至少对于已经运行得足够快、可以使用的算法来说是如此。在软件中表达高并行性允许硬件分摊(或通常完全隐藏)内存延迟。当然,未来更深远的架构可能是量子计算


    我从英伟达听说英特尔的一个错误
      mov eax,b
      xor edx,edx
      div dword ptr c
      mov a,eax
    
      mov r5,addr b
      mov r5,[r5]
      mov r6,addr c
      mov r6,[r6]
      div r7,r5,r6
      mov r5,addr a
      mov [r5],r7