海湾合作委员会:内联装配 - 适合?

时间:2009-10-22 18:43:44

标签: gcc assembly inline-assembly

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

  1. 能够内联汇编有什么好处?

  2. 是否可以使用GCC作为汇编编译器/汇编器来学习汇编?

  3. 我发现了一些文章,但是它们都是古老的,2000年和2001年,并不确定它们的相关性。

    谢谢

7 个答案:

答案 0 :(得分:12)

内联汇编的好处是拥有汇编代码,内联(等待等待,不要杀了我)。通过这样做,您不必担心调用约定,并且您可以更好地控制最终目标文件(这意味着您可以决定每个变量的位置 - 哪个寄存器或存储的内存),因为该代码赢了不进行优化(假设您使用volatile关键字)。

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

将它们转换为程序集
gcc -S source.c

有了这个,以及架构手册(MIPS,英特尔等)以及GCC手册,您可以走很长的路。

网上有一些资料。

http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/

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

希望它有所帮助。

答案 1 :(得分:9)

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

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

Time Stamp Counter - Wikipedia

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

答案 2 :(得分:8)

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

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

答案 3 :(得分:3)

  1. 嵌入自定义汇编代码的好处是有时(我敢说,经常是这样)开发人员可以编写比编译器更高效的汇编代码。因此,对于性能极高的项目,自定义书面组装可能是有益的。游戏往往会浮现在脑海中......

  2. 至于用它来学习装配,我毫不怀疑你可以。但是,我认为使用实际的程序集SDK可能是更好的选择。除了学习如何使用该语言的标准实验外,您可能还需要有关建立开发环境的知识。

答案 4 :(得分:2)

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

关于它的好处,我同意jldupont,主要是混淆。理论上,它允许您轻松地与编译器集成,因为扩展的asm的复杂语法允许您在编译器使用时与编译器合作,并且它允许您告诉编译器您想要这个以及从内存加载它并放在寄存器中,最后,它允许编译器被警告你已经破坏了这个寄存器或那个寄存器。

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

我相信真正的答案是,一旦你知道了对比DSL,就会更容易。人们只需要输入 asm 并混淆C程序,而不是去修改Makefile并在构建和部署工作流程中添加新模块。

答案 5 :(得分:2)

这不是一个真正的答案,而是对其他人的答案的扩展评论。

内联汇编仍用于访问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

但我不需要这样做,哦,可能十五年,因为现代编译器更聪明。实际上,当前的编译器有时会产生比大多数人更高效的代码。特别是对于具有长流水线,分支预测等的CPU,执行速度最快的指令序列并不总是对人类最有意义的指令。所以你可以说,“按顺序执行A B C D”,编译器将对所有周围的命令进行加扰以提高效率。

对于初学者来说,使用内联汇编进行一些操作是很好的,但如果你是认真的,我会回应那些建议你在一段时间后转向“真正的”汇编程序的人。

答案 6 :(得分:1)

  1. 手动优化大量执行的循环。 This文章很旧,但可以让您了解手动编码程序集的优化种类。

  2. 您也可以直接使用汇编程序gcc使用。它被称为as(见man as)。但是,许多有关汇编的书籍和文章都假设您使用的是DOS或Windows环境。因此,在Linux上学习可能有点困难(可能在虚拟机上运行FreeDOS),因为您不仅需要知道您编写的处理器(通常可以下载官方手册),还需要知道如何挂钩到OS你正在跑步。

  3. 使用DOS的一本不错的初学者书是Norton和Socha的书。这是相当古老的(第3版和最新版本是1992年),所以你可以得到类似$ 0.01的使用副本(不开玩笑)。我所知道的唯一一本特定于Linux的书是免费的“Programming from the Ground Up