如何做到这一点呢?

如果我想分析某些东西是如何编译的,我该如何获得发出的程序集代码?


当前回答

使用“-S”作为选项。它在终端中显示程序集输出。

其他回答

最近我想知道a中每个函数的组装,我是这样做的:

gcc main.c    // 'main.c' source file
gdb a.exe     // 'gdb a.out' in Linux

广东发展银行:

disass main   // Note here 'main' is a function
              // Similarly, it can be done for other functions.

如果您正在寻找LLVM程序集:

llvm-gcc -emit-llvm -S hello.c

如前所述,查看-S标志。

'-fdump-tree'标志家族也值得一看,特别是-fdump-tree-all,它可以让您看到GCC的一些中间形式。这些程序通常比汇编程序更具可读性(至少对我来说),并让您了解优化传递的执行情况。

-save-temps

元数据的回答中提到了这一点,但让我进一步举例说明。

与-S相比,这个选项的最大优点是可以很容易地将其添加到任何构建脚本中,而不会过多地干扰构建本身。

当你这样做时:

gcc -save-temps -c -o main.o main.c

文件c

#define INC 1

int myfunc(int i) {
    return i + INC;
}

现在,除了正常的主输出。O,当前工作目录还包含以下文件:

main.i is a bonus and contains the preprocessed file: # 1 "main.c" # 1 "<built-in>" # 1 "<command-line>" # 31 "<command-line>" # 1 "/usr/include/stdc-predef.h" 1 3 4 # 32 "<command-line>" 2 # 1 "main.c" int myfunc(int i) { return i + 1; } main.s contains the desired generated assembly: .file "main.c" .text .globl myfunc .type myfunc, @function myfunc: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movl %edi, -4(%rbp) movl -4(%rbp), %eax addl $1, %eax popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE0: .size myfunc, .-myfunc .ident "GCC: (Ubuntu 8.3.0-6ubuntu1) 8.3.0" .section .note.GNU-stack,"",@progbits

如果你想对大量的文件执行此操作,可以考虑使用:

-save-temps=obj

将中间文件保存到与-o对象输出相同的目录,而不是当前工作目录,从而避免了潜在的basename冲突。

关于这个选项的另一个很酷的事情是如果你添加-v:

gcc -save-temps -c -o main.o -v main.c

它实际上显示了正在使用的显式文件,而不是/tmp下丑陋的临时文件,因此很容易知道正在发生什么,其中包括预处理/编译/汇编步骤:

/usr/lib/gcc/x86_64-linux-gnu/8/cc1 -E -quiet -v -imultiarch x86_64-linux-gnu main.c -mtune=generic -march=x86-64 -fpch-preprocess -fstack-protector-strong -Wformat -Wformat-security -o main.i
/usr/lib/gcc/x86_64-linux-gnu/8/cc1 -fpreprocessed main.i -quiet -dumpbase main.c -mtune=generic -march=x86-64 -auxbase-strip main.o -version -fstack-protector-strong -Wformat -Wformat-security -o main.s
as -v --64 -o main.o main.s

它在Ubuntu 19.04 (Disco Dingo) amd64, GCC 8.3.0中进行了测试。

制定预定义目标

CMake会自动为预处理文件提供一个目标:

make help

告诉我们可以这样做:

make main.s

这个目标运行:

Compiling C source to assembly CMakeFiles/main.dir/main.c.s
/usr/bin/cc    -S /home/ciro/hello/main.c -o CMakeFiles/main.dir/main.c.s

所以这个文件可以在CMakeFiles/main.dir/main.c.s目录下找到。

它在CMake 3.16.1上进行了测试。

下面是在Windows上查看/打印任何C程序的汇编代码的步骤:

在控制台/终端命令提示符中:

Write a C program in a C code editor like Code::Blocks and save it with filename extension .c Compile and run it. Once run successfully, go to the folder where you have installed your GCC compiler and enter the following command to get a ' .s ' file of the ' .c' file cd C:\gcc gcc -S complete path of the C file ENTER An example command (as in my case) gcc -S D:\Aa_C_Certified\alternate_letters.c This outputs a '.s' file of the original '.c' file. After this, type the following command cpp filename.s ENTER Example command (as in my case) cpp alternate_letters.s <enter>

这将打印/输出C程序的整个汇编语言代码。