看起来,除了开发设备驱动程序或操作系统内核的核心等以外,现在没有人使用程序集。任何人都知道它目前用于其他事情吗?
我的意思是PC风格和更大的硬件,而不是嵌入微小处理器的东西。
答案 0 :(得分:9)
或多或少显然,编译器后端和动态重新编译CPU模拟器等相关技术需要汇编编程。
汇编语言编程也用于视频游戏编程的某些频率,以利用当前编译器尚未很好支持的新CPU功能。然而,这种情况有点罕见,尤其是在PC上,有很多不同的CPU需要支持。我希望在使用统一硬件的控制台上这会更常见。
编辑: 目前,游戏在GPU中进行大部分计算。仅使用OpenGL或DirectX并不总是能够充分利用这些计算资源,这些处理器的供应商提供了大量工具来挤出更多的硬件。虽然Cuda或OpenCL是众所周知的术语,但它们仍然处于相对较高的GPU硬件抽象层次,填补的角色非常类似于C在典型(Von Neuman)CPU上的作用。查看这些产品的developer pages,您会发现有几种方法可以最佳地使用GPU计算资源,并且可以在每个抽象层次上使用。
答案 1 :(得分:9)
Boost,与现代C ++一样,使用内联汇编来处理低级性能关键位,如atomic shared counters。
编辑:正如@TokenMacGuy正确指出的那样,“性能”在这里是一个错误的词。 Boost使用汇编语言来处理标准C ++中无法实现的事情,例如原子(并且由于某种原因,编译器内在函数不可用。)
答案 2 :(得分:3)
我相信Folding @ Home并行计算项目使用优化的汇编代码来实现最大速度。*
*注意:这并不意味着汇编总是比C / C ++快。
答案 3 :(得分:2)
根据经验,在测试和验证新处理器设计时会大量使用它。必须使用编译器不一定生成的代码来强调指令集。而不是用一些更高级别的语言编写可能会或可能不会编译到想要检查的指令,而不是手动编写程序集。
答案 4 :(得分:2)
正如一则轶事:过山车大亨完全(或几乎)由Chris Sawyer(wikipedia reference)在x86大会上撰写。
答案 5 :(得分:1)
有人为此code golf for changing numbers to words使用了汇编。
答案 6 :(得分:1)
我最后一次遇到汇编程序是因为我曾经破解了Quake I源代码。所有的数学库(尤其是点积的任何东西)都是由John Carmack在MASM中编写的。这个东西是浮点密集的,当时C不如专业手工制作的ASM用于浮动操作。此外,由于计算机的CPU限制更多,而且由于Quake使用CPU进行渲染,因此每个操作都很重要,因此ASM运行得最好。
答案 7 :(得分:1)
如果您花费大量时间查看C / C ++源代码的汇编输出,您会很快注意到大多数优秀的优化编译器都能比优秀的汇编程序员更好地进行组装。关于何时内联函数,如何处理循环,post与pre增量的决定(许多编译器现在决定如何为你处理)等。最好的运气胜过一个拥有大型社区开发它的编译器和更好的能力在正常情况下至少管理地址和定义。
即使设备驱动程序和操作系统内核通常也不是使用大量程序集编写的。实时程序的小型性能关键部分是您可以在今天的应用程序中找到程序集的地方。
当你开始谈论RISC程序集时,它会变得更糟,这对于像分支和交换这样的优化指令以及许多通用寄存器而言往往非常有效。大多数人并不比优化编译器更聪明。那些人通常都在编写优化编译器。
答案 8 :(得分:1)
在C语言中,从基础层面来看,很容易看出一组指令如何成为汇编程序(如果您了解底层架构)。但有时候,汇编程序无法被击败。请注意,编写糟糕,低效的汇编代码与编写糟糕的C代码一样容易。汇编程序的可维护性较低。它在任何地方都不便携。
这一切都取决于您正在使用的C编译器的质量。有些人比其他人做得好。大多数编译器允许您查看它们生成的汇编代码。如果您认为自己可以做得更好,而且代码段很重要,那就去做吧。否则,避免它。考虑到合适的编译器,精心制作的C可以非常接近金属。
答案 9 :(得分:1)
高级语言不支持的实用程序函数。一个古老的例子是我试图获得C和Unix在RSX-11M上使用Fortran时提供的一些细节。我想传递格式化字符串并使用更简单的C样式。 printf()需要执行一些类似操作的操作。 Fortran没有这个概念所以icast()和rcast()是用汇编语言编写的。实现的其他功能是move()和clone()。这些并没有为效率做太多,因为他们在Fortran的思维模式之外扩展了概念。
答案 10 :(得分:0)
我知道程序集用于非常繁重的游戏代码。例如,像素着色器具有非常严格的指令预算;为了得到你想要的效果,你几乎必须编码到金属。
答案 11 :(得分:0)
我认为使用汇编程序的最突出的程序是boot-loader。
答案 12 :(得分:0)
我在当天写了IBM 370汇编程序,用于从操作系统中的钩子收集信息的大型应用程序(供应商销售的产品,由大公司使用)。但是,我只是在汇编程序中进行简单的jane编程:屏幕,报告等。它跑得非常快,但完全是汇编程序。我确信它仍在运行并且今天售价高于Windows和Linux平台的典型软件价格。
答案 13 :(得分:0)
根据Knuth,研究算法的效率。他在书中提到没有更好的方法来研究算法如何工作而不是在汇编中写作。
答案 14 :(得分:0)
有时某些功能无法在高级语言中实现,而是使用内联汇编。例如,C ++库Qt中有一些内联汇编;我相信它被用于对象内省系统的一部分。
此外,glibc(gcc的C库)使用程序集进行优化。 IIRC基于软件的浮点数学实现之一具有用汇编编写的重要块。
然而,学习汇编的主要原因之一是调试。在某些情况下,我已经陷入了不知道汇编会阻止我调试特别棘手的问题的情况。
答案 15 :(得分:0)
几乎每种语言中的一个速率确定代码(在内存管理需要动态之后)是运行时(-library)用来移动内存的例程。 Move(),memcpy等,以及搜索字节(strchr)等原语。
这些也经常用汇编语言编写,使用特殊的专用代码来利用对齐。