GCC:内联汇编-适合于?

GCC:内联汇编-适合于?,gcc,assembly,inline-assembly,Gcc,Assembly,Inline Assembly,所以我刚刚发现GCC可以进行内联汇编,我想知道两件事: 能够内联汇编有什么好处 可以将GCC用作汇编编译器/汇编程序来学习汇编吗 我找到了几篇文章,但它们都是老掉牙的,2000年和2001年,不太确定它们的相关性 感谢内联汇编通常用于访问编译器未以其他方式公开的硬件功能(例如,未提供内部函数的向量SIMD指令),和/或用于手动优化编译器生成次优代码的代码的性能关键部分 当然,没有什么可以阻止您使用内联汇编程序来测试用汇编语言编写的例程;然而,如果您打算编写大量代码,最好使用真正的汇编程序,以避免

所以我刚刚发现GCC可以进行内联汇编,我想知道两件事:

  • 能够内联汇编有什么好处

  • 可以将GCC用作汇编编译器/汇编程序来学习汇编吗

  • 我找到了几篇文章,但它们都是老掉牙的,2000年和2001年,不太确定它们的相关性


    感谢

    内联汇编通常用于访问编译器未以其他方式公开的硬件功能(例如,未提供内部函数的向量SIMD指令),和/或用于手动优化编译器生成次优代码的代码的性能关键部分

    当然,没有什么可以阻止您使用内联汇编程序来测试用汇编语言编写的例程;然而,如果您打算编写大量代码,最好使用真正的汇编程序,以避免陷入不相关的困境。您可能会发现GNU汇编程序与工具链的其余部分一起安装;)

  • 嵌入自定义汇编代码的好处是,有时(我敢说,经常是这样)开发人员可以编写比编译器更高效的汇编代码。因此,对于性能极为密集的项目,定制编写的程序集可能是有益的。我常常想到游戏

  • 至于用它来学习组装,我毫不怀疑你可以。但是,我认为使用实际的汇编SDK可能是更好的选择。除了学习如何使用该语言的标准实验之外,您可能还需要有关设置开发环境的知识


  • 内联汇编的好处是让汇编代码内联(等等,别杀了我)。通过这样做,您不必担心调用约定,并且您对最终的对象文件有了更多的控制(这意味着您可以决定每个变量的位置—到哪个寄存器,或者它是否存储在内存中),因为代码不会被优化(假设您使用volatile关键字)

    关于你的第二个问题,是的,这是可能的。您可以编写简单的C程序,然后使用

    gcc -S source.c
    
    有了这些,以及体系结构手册(、Intel等)和手册,您可以走很长的路

    网上有一些资料

    内联汇编的缺点是,代码通常不能在不同的编译器之间移植


    希望有帮助。

    内联汇编对于就地优化和访问任何库或操作系统都没有公开的CPU功能非常有用

    例如,某些应用程序需要严格跟踪时间。在x86系统上,RDTSC assembly命令可用于读取内部CPU计时器


    使用带有内联汇编的GCC或任何C/C++编译器对于小代码段都很有用,但许多环境没有良好的调试支持—在开发内联汇编提供特定功能的项目时,这一点更为重要。此外,如果使用内联汇编,可移植性将成为一个经常出现的问题。最好在合适的环境(GNU assembler,MASM)中创建特定项,并根据需要将它们导入项目。

    您不应该通过使用内联asm功能来学习汇编语言

    关于它的好处,我同意,主要是混淆。理论上,它允许您轻松地与编译器集成,因为extended asm的复杂语法允许您在寄存器使用方面与编译器合作,并允许您告诉编译器您希望从内存中加载此项和彼项,并将其放入寄存器中,最后,它允许编译器得到警告,您已经破坏了这个或那个寄存器

    然而,所有这些都可以通过简单地编写符合标准的C代码,然后编写一个汇编模块,并作为一个普通函数调用扩展来完成。也许在很久以前,过程调用机器操作太慢,无法容忍,但今天您不会注意到

    我相信真正的答案是,一旦你知道了限制性的DSL,这会更容易。人们只是加入一个asm并混淆C程序,而不是麻烦地修改Makefile并向构建和部署工作流添加一个新模块

  • 对大量执行的循环进行手动优化。这篇文章很旧,但可以让您了解手工编码程序集用于哪些优化

  • 您还可以直接使用gcc使用的汇编器。它被称为
    as
    (参见
    man-as
    )。然而,许多关于汇编的书籍和文章都假设您使用的是DOS或Windows环境。因此,在Linux上学习(可能在虚拟机上运行FreeDOS)可能有点困难,因为您不仅需要了解编写代码的处理器(通常可以下载官方手册),还需要了解如何连接到正在运行的操作系统


  • 一本很好的使用DOS的入门书是Norton和Socha写的。它很旧(第三版和最新版本是1992年的),所以你可以花0.01美元(不是开玩笑)买到二手书。我所知道的唯一一本专门针对Linux的书是免费的“

    这不是一个真正的答案,而是对其他人答案的一种延伸评论

    内联程序集仍然用于访问CPU功能。例如,在手机中使用的ARM芯片中,不同的制造商通过特殊功能区分其产品,这些功能需要不寻常的机器语言指令,而这些指令在C/C++中是没有对等的

    早在80年代和90年代初,我就经常使用内联汇编来优化循环。例如,当时针对680x0处理器的C编译器会做一些非常愚蠢的事情,比如:

    calculate a value and put it in data register D1
    PUSH D1, A7     # Put the value from D1 onto the stack in RAM
    POP D1, A7      # Pop it back off again
    do something else with the value in D1
    
    但我已经有十五年没有这样做了,因为现代编译器要聪明得多。事实上,目前的公司