如何使用gcc编译到程序集

Met*_*est 31 c linux x86 gcc

如何使用gcc编译为汇编而不是可执行文件.我知道有一个-S标志,但我在makefile中使用它.例如,如果我使用标志-O3 -o exe_name,我应该在哪里放-S标志?

Bas*_*tch 36

我建议也使用,-fverbose-asm因为生成的汇编程序有一些生成的注释,"解释"代码.例如:

gcc -S -fverbose-asm -O2 foo.c
Run Code Online (Sandbox Code Playgroud)

将生成foo.s(通过一些注释)编译生成的汇编程序代码foo.c

要了解GCC优化正在做什么甚至可以尝试-fdump-tree-all(但这会产生数百个文件!).

  • 相关文章:[如何从GCC / clang程序集输出中消除“噪音”?](/sf/ask/2698648151/)了解更多使asm更具可读性的方法,以及阅读x86 asm的精彩介绍视频马特·戈德博特(Matt Godbolt)(在线编译器和浏览器成名)。 (2认同)

Mac*_*ade 24

您可以要求GCC生成程序集文件,而不是目标文件(或可执行文件).

例如:

gcc -Wall -c test.c
Run Code Online (Sandbox Code Playgroud)

将从test.c(test.o)生成一个目标文件.

gcc -Wall -o test test.c
Run Code Online (Sandbox Code Playgroud)

将从test.c生成一个名为'test'的可执行文件

gcc -Wall -S test.c
Run Code Online (Sandbox Code Playgroud)

将从test.c(test.s)生成一个程序集文件

  • 恭敬地不同意:你做*编译*到汇编,然后*汇编*到一个目标文件.例如,我系统上`-S`的文档说"在编译阶段之后停止; 不要组装 (6认同)
  • @Macmade,编译也意味着将高级语言结构转换为低级操作码(顺便提一下,可以在汇编中表示然后转换为机器码).您的里程可能会有所不同(特别是使用"托管"语言,如C#,编译到CIL,然后编译到JIT到机器代码). (3认同)
  • 为什么你说你没有"编译"到汇编?这正是它正在做的事情!编译!机器代码即装配!编译后,只需要用0-1或字母书写即可. (2认同)
  • 在我看来,编译意味着将源代码转换为机器代码.汇编是源代码,即使非常接近机器代码. (2认同)

Mat*_*Mat 14

把它放在任何地方.

gcc -O3 -S -o output.asm ...
Run Code Online (Sandbox Code Playgroud)

将生成的汇编存储在output.asm.

  • 默认情况下`-S`写了类似`filename.s`的东西,所以我不认为`-o`参数是必要的 (2认同)