gcc - "gcc -x c"和 "gcc -x c++"汇编输出的区别

标签 gcc assembly g++

我在文件 main.c 中有以下代码:

int main() {
    int i;
    for (i = 0; i < 5; i++) {
    }

    return 0;
}

当我用 gcc -x c -m32 -S -O0 -o main.s main.c 编译它时(在 Fedora 16 64 位下)我得到这个输出:
    .file   "main.c"
    .text
    .globl  main
    .type   main, @function
main:
.LFB0:
    .cfi_startproc
    pushl   %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
    subl    $16, %esp
    movl    $0, -4(%ebp)
    jmp .L2
.L3:
    addl    $1, -4(%ebp)
.L2:
    cmpl    $4, -4(%ebp)
    jle .L3
    movl    $0, %eax
    leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
.LFE0:
    .size   main, .-main
    .ident  "GCC: (GNU) 4.6.2 20111027 (Red Hat 4.6.2-1)"
    .section    .note.GNU-stack,"",@progbits

但是,当我使用 gcc -x c++ -m32 -S -O0 -o main.s main.c 时除了这些行,我得到相同的输出:
.L2:
    cmpl    $4, -4(%ebp)
    setle   %al
    testb   %al, %al
    jne .L3

我的问题是:为什么它使用 setletestb而不是 jle在 C++ 代码中?它更有效吗?

附言另外,有没有办法摆脱这些.cfi_*汇编输出中的指令?

最佳答案

好吧,您使用的是不同的编译器,因此获得不同的输出并不奇怪。 clang在将程序编译为 C 或 C++ 时,确实会给出完全相同的结果,如果您感兴趣的话:

$ cp example.c example.cpp
$ clang -o exampleC example.c
$ clang++ -o exampleC++ example.cpp
$ otool -tV exampleC > C
$ otool -tV exampleC++ > C++
$ diff C C++
1c1
< exampleC:
---
> exampleC++:
$

我从 gcc 得到相同的结果和 g++在我的机器上也是如此,所以看起来这只是您特定编译器版本的一个怪癖。

关于gcc - "gcc -x c"和 "gcc -x c++"汇编输出的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9338164/

相关文章:

c++ - Eclipse/Code::Block 不运行应用程序

assembly - 操作码 '89' 的 x86 Modrm/Sib/位移字节

opencv - 使用g++进行编译的OpenCV错误(Mountain Lion 10.8)

c++ - 尽管我设置了 CC=g++,为什么我的 makefile 仍调用 gcc?

c++ - 在 gcc 中编译时出错

gcc - 将参数或变量指定为 __attribute__ ((unused)) 是否允许编译器执行任何其他优化?

c - gcc 为 qsort 生成警告

assembly - 什么是被调用者和调用者保存的寄存器?

c++ - 在 tbb 原子变量上进行位测试和设置 (BTS)

g++ - 在学习 C++ 时,我应该总是使用带有 g++ 的 -Wall 和 -pedantic 开关吗?