代码之家  ›  专栏  ›  技术社区  ›  JCCyC

什么样的项目(除了明显的操作系统之外)使用汇编语言?

  •  10
  • JCCyC  · 技术社区  · 17 年前

    表面上看,除了开发设备驱动程序或操作系统内核等核心之外,现在没有人使用汇编。有人知道它目前正被用于其他方面吗?

    我的意思是PC风格和更大的硬件,而不是嵌入式的小处理器。

    16 回复  |  直到 17 年前
        1
  •  9
  •   Nikolai Fetissov    17 年前

    Boost 作为现代C++,它使用内联汇编来执行低级别性能关键位。 atomic shared counters .

    edit:as@tokenmacguy correctly notes,“performance”是一个错误的词。Boost使用汇编语言来完成无法在标准C++中完成的事情,如原子(编译器编译器本质不可用)。

        2
  •  9
  •   SingleNegationElimination    17 年前

    显然,编译器后端和相关技术(如动态重新编译CPU模拟器)需要汇编编程。

    汇编语言编程也用于视频游戏编程,以利用当前编译器尚不支持的新CPU功能。然而,这是一种罕见的,这些天,特别是因为在个人电脑上,有这么多不同的CPU需要支持。不过,我希望这在具有统一硬件的控制台上更为常见。

    编辑: 如今,游戏的大部分计算都是用GPU完成的。仅仅使用OpenGL或DirectX并不能充分利用这些计算资源,而且这些处理器的供应商提供了一系列工具来从硬件中榨取更多的资源。虽然cuda或opencl是众所周知的术语,但它们在GPU硬件上仍然处于相对较高的抽象级别,所扮演的角色与典型(von neuman)CPU上的C角色非常相似。 developer pages 对于这些产品,您将找到许多方法来优化地使用GPU计算资源,并在每个抽象级别上使用。

        3
  •  3
  •   MiffTheFox    17 年前

    我相信Folding@Home并行计算项目使用优化的汇编代码以实现最高速度。*

    *注意:这并不意味着汇编总是比C/C++更快。

        4
  •  2
  •   Nathan Fellman    17 年前

    从经验来看,它在测试和验证新处理器设计时被大量使用。必须使用编译器不必生成的代码强调指令集。与其用更高级的语言来编写可能或不可能编译成您想要检查的指令,不如用手工编写程序集。

        5
  •  2
  •   Yuval Adam    17 年前

    就像一件轶事: 过山车大亨 完全(或几乎)由Chris Sawyer在x86汇编中编写( wikipedia reference )

        6
  •  1
  •   Community Mohan Dere    9 年前

    有人为此使用了程序集 code golf for changing numbers to words .

        7
  •  1
  •   Andrew Scagnelli    17 年前

    我最后一次遇到汇编程序是在我以前破解地震源代码的时候。所有的数学库(尤其是点产品库)都是约翰·卡马克用MASM编写的。这是一个浮点密集型的东西,而在那个时候,C并没有熟练的手工制作的ASM那样适合于浮点操作。此外,由于计算机的CPU限制更大,而且由于Quake使用CPU进行渲染,所以每个操作都很重要,因此ASM工作得最好。

        8
  •  1
  •   marr75    17 年前

    如果你花很多时间来查看C/C++源的程序集输出,你会很快发现,大多数优秀的编译器都比汇编程序好。决定什么时候内联一个函数,如何处理循环,post与pre-increment(许多编译器现在决定如何处理)等。幸运的是,它比一个拥有开发它的大型社区和比您更好的地址和定义管理能力的编译器更出色,至少在正常情况下。

    即使是设备驱动程序和操作系统内核,通常也不会使用大量程序集编写。实时程序中性能关键的小部分是您在今天的应用程序中可以找到程序集的地方。

    更糟糕的是,当你开始谈论RISC汇编时,它往往对诸如分支和交换之类的优化指令以及几十个通用寄存器有着惊人的效果。大多数人并不比优化编译器更聪明。那些通常正在编写优化编译器的人。

        9
  •  1
  •   xcramps    17 年前

    在C中,在基本级别上,很容易看到一组指令是如何成为汇编程序的(如果您了解底层体系结构的话)。但有时,装配工不能被打败。注意,编写蹩脚的、效率低下的汇编代码和编写蹩脚的C代码一样容易。而且汇编程序的维护性要差得多。而且它在任何地方都不可携带。

    这一切都取决于你使用的C编译器的质量。有些人做得比其他人好。大多数编译器允许您查看它们生成的汇编程序代码。如果您认为您可以做得更好,并且代码段是关键的,那么就做吧。否则,要避免。精心制作的C可以非常接近金属,给一个体面的编译器。

        10
  •  1
  •   CW Holeman II    17 年前

    高级语言不希望支持的实用程序函数。一个古老的例子是,当我试图获得C和Unix在RSX-11M上使用Fortran时提供的一些细节时,我想传递格式化字符串并使用更简单的C样式。printf()需要执行一些类似强制转换的操作。fortran没有这个概念,所以icast()和rcast()是用汇编程序编写的。其他实现的函数是move()和clone()。这些并不是为了提高效率而做的,而是为了将概念扩展到Fortran的思维之外。

        11
  •  0
  •   Paul Sonier    17 年前

    我知道程序集用于非常大量的游戏代码。例如,像素遮影器的指令预算非常紧张;要获得您想要的效果,您几乎必须对金属进行编码。

        12
  •  0
  •   Thomas Danecker    17 年前

    我认为使用汇编程序的最突出的程序是引导加载程序。

        13
  •  0
  •   KM.    17 年前

    当时我为一个大型应用程序(供应商销售的产品,大公司使用)编写了IBM370汇编程序,它从操作系统中的钩子收集信息。然而,我只是在用汇编程序做简明扼要的编程:屏幕、报告等。它跑得惊人的快,但完全是装配工做的。我敢肯定,它现在仍在运行和销售,价格远远高于Windows和Linux平台的典型软件。

        14
  •  0
  •   kemiller2002    17 年前

    根据Knuth,研究算法的效率。他在书中提到,没有比在汇编中写作更好的方法来研究算法是如何工作的。

        15
  •  0
  •   jkerian    17 年前

    有时某些特性不能在高级语言中实现,而是使用内联汇编。在C++库QT中有一些内联程序集,例如,我相信它被用于对象自省系统的一部分。

    此外,glibc(gcc的C库)使用assembly进行优化。IIRC是一种基于软件的浮点数学实现,它有大量的块是在汇编中编写的。

    然而,学习装配的主要原因之一是调试。有几次,我陷入了这样的境地:不知道装配会阻止我调试一个特别棘手的问题。

        16
  •  0
  •   Marco van de Voort    17 年前

    几乎每种语言中的一种速度决定代码(在内存管理所需的动态代码之后)是运行时(-library)用来移动内存的例程。move()、memcpy等,以及诸如搜索字节(strchr)等原语。

    这些代码也经常用汇编程序编写,使用专门的代码来利用对齐。