代码之家  ›  专栏  ›  技术社区  ›  B.Gen.Jack.O.Neill

有没有C编译器在asm中显示链接程序?

  •  4
  • B.Gen.Jack.O.Neill  · 技术社区  · 16 年前

    我正在寻找一个编译器或更好的C语言开发环境,它可以以汇编程序的形式生成完全链接的程序,包括来自CRT的函数。有吗?我试过visualc速成2008。它有一个拆卸器,但有点奇怪。我是说,由于某些原因,它显示了许多“奇怪”的代码行,例如 mov a,#3

    5 回复  |  直到 15 年前
        1
  •  4
  •   dawg    16 年前

    gcc 将生成ASM文件。如果你使用 gcc -Wa,-adhln -g [source.c] gcc和as将把C源代码与生成的汇编代码交错。

    clang 具有 LLVM 将生成高质量的ASM文件。

    long Fibonacci(long x) {
      if (x == 0) return 0;  
      if (x == 1) return 1;
      return Fibonacci(x - 1) + Fibonacci(x - 2);
    }
    

    成为以下ASM文件:

    _Fibonacci:
    Leh_func_begin1:
        pushq   %rbp
    Ltmp0:
        movq    %rsp, %rbp
    Ltmp1:
        subq    $32, %rsp
    Ltmp2:
        movq    %rdi, -16(%rbp)
        movq    -16(%rbp), %rax
        cmpq    $0, %rax
        jne LBB1_2
        movq    $0, -8(%rbp)
        jmp LBB1_5
    LBB1_2:
        movq    -16(%rbp), %rax
        cmpq    $1, %rax
        jne LBB1_4
        movq    $1, -8(%rbp)
        jmp LBB1_5
    LBB1_4:
        movq    -16(%rbp), %rax
        movabsq $1, %rcx
        subq    %rcx, %rax
        movq    %rax, %rdi
        callq   _Fibonacci
        movq    -16(%rbp), %rcx
        movabsq $2, %rdx
        subq    %rdx, %rcx
        movq    %rcx, %rdi
        movq    %rax, -24(%rbp)
        callq   _Fibonacci
        movq    -24(%rbp), %rcx
        addq    %rax, %rcx
        movq    %rcx, -8(%rbp)
    LBB1_5:
        movq    -8(%rbp), %rax
        addq    $32, %rsp
        popq    %rbp
        ret
    Leh_func_end1:
    

    当您这样做时,您将希望关闭优化。

    也可以将生成的ASM代码与较高级别的源代码交错,如writer所做的那样 HERE .

        2
  •  1
  •   dgarcia    16 年前

        3
  •  1
  •   t0mm13b    16 年前

    命令行选项,尤其是在VisualC++中使用C++编译器,是/FA

                              -OUTPUT FILES-
    


    /Fd[file]名称.PDB文件
    /Fe名称可执行文件 /Fm[文件]名称映射文件
    /Fo name对象文件 /Fp名称预编译头文件 /FR[file]名称扩展.SBR文件 注释并可选地命名.xdc 文件

                              -PREPROCESSOR-
    

    /AI添加到程序集搜索路径
    /FU强制使用组件/模块
    /D{=|#}定义宏/E 预处理到标准输出
    /EP预处理到标准输出,无#行/P 预处理到文件
    /Fx合并注入代码到文件 /FI名称强制包含文件
    /U删除预定义宏/U
    /我添加到包含搜索路径/X

    如果不是的话, 全部 编译器有能力做到这一点,关键在于找出要使用的开关。

        4
  •  0
  •   Jerry Coffin    16 年前

    dumpbin /disasm

        5
  •  0
  •   leppie    15 年前
    objdump -D <file-name>