c - 是否有任何 C 编译器可以向您展示 asm 中的链接程序?

标签 c compiler-construction assembly

我正在寻找适用于 C 的编译器或更好的 IDE,它可以生成完全链接的程序,包括来自 CRT 的汇编程序形式的函数。有没有?我试过 Visual C Express 2008。它有一个反汇编程序,但有点奇怪。我的意思是出于某种原因,它显示了许多“奇怪”的代码行,例如大约 100 行的 mov a,#3...。它用于学习目的。感谢提示。

最佳答案

gcc将生成 ASM 文件。如果您使用 gcc -Wa,-adhln -g [source.c] gcc 和 as 会将 C 源代码行与生成的汇编代码交织在一起。

clangLLVM将生成高质量的 ASM 文件。

例子:

这个 C 函数:

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 代码与更高级别的源代码交错,例如作者所做的 HERE .

关于c - 是否有任何 C 编译器可以向您展示 asm 中的链接程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3867721/

相关文章:

c++ - 浮点比较精度

c# - Web 服务可以在 asp.net 中运行,但不能在 IIS 中运行

c++ - asin 使用 Clang 在不同的平台上产生不同的答案

c# - C# 编译器是否转换和存储静态变量?

c - 我的 C ARDUINO 程序中用于 LED 延迟功能的内联汇编代码

assembly - 访问树莓派GPIO地址时出现段错误

C- 不正确的方法需要纠正

c - 排空Intel Core 2 Duo 的指令流水线?

c++ - 将 Nginx 构建到库中

assembly - CA65:来自 16 位计算地址的 'Range error'