C++ 程序集和cpp代码之间的一对一关联在哪里?

C++ 程序集和cpp代码之间的一对一关联在哪里?,c++,assembly,C++,Assembly,我试图检查此代码在程序集中的运行方式: int main(){ if (0){ int x = 2; x++; } return 0; } 我想知道如果(0)是什么意思 我在Linux中使用了shell命令g++-shelloworld.cpp 得到了这个密码: .file "helloWorld.cpp" .text .globl main .type main, @function main: .LFB0: .c

我试图检查此代码在程序集中的运行方式:

int main(){
  if (0){
    int x = 2;
    x++;
  }
  return 0;
}
我想知道如果(0)是什么意思

我在
Linux
中使用了shell命令
g++-shelloworld.cpp

得到了这个密码:

    .file   "helloWorld.cpp"
    .text
    .globl  main
    .type   main, @function
main:
.LFB0:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    movl    $0, %eax
    popq    %rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE0:
    .size   main, .-main
    .ident  "GCC: (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1"
    .section    .note.GNU-stack,"",@progbits
  • 我希望程序集将包含一些
    JZ
    ,但它在哪里

  • 如何在没有优化的情况下编译代码
    编译器将该代码作为死代码消除,例如,永远不会运行的代码。剩下的就是建立堆栈框架并设置函数的返回值<代码>如果(0)始终不是真的。如果您想要获得
    JZ
    ,那么您可能应该执行类似于
    If(variable==0)
    的操作。请记住,编译器并不需要实际发出
    JZ
    指令,它可以使用任何其他方法来实现相同的功能。将高级语言编译成汇编语言很少是一种清晰的一对一的关联。

    编译器可能会将其优化掉,因为它永远都不是真的。

    优化器删除了if条件和其中的所有代码,因此它根本不会显示。

    if(0){}块已由编译器优化,因为它永远不会被调用。
    因此,您的函数只返回0(movl$0,%eax)

    代码可能已经过优化

    if (0){
       int x = 2;
      x++;
    }
    
    已经被淘汰了


    movl$0,%eax
    是设置返回值的位置。其他指令只是程序init和出口。

    C++源代码之间没有直接的、保证的关系。 生成的汇编程序。C++源代码定义了一个特定的 语义,编译器输出将实现的机器代码 这些语义的可观察行为。编译器是如何做到这一点的, 它输出的实际代码可能会有很大的差异,甚至在同一时间段内 底层硬件;如果有一个编译器 生成的代码将
    0
    0
    进行比较,然后进行条件分析 如果结果相等,则跳转,不管C++源代码是什么 是

    在您的示例中,代码中唯一可观察到的行为是返回
    0
    到操作系统。编译器生成的任何东西都必须做到这一点(并且 没有其他可观察到的行为)。您显示的代码不是最佳的 这:

    这才是真正需要的。当然,编译器可以自由地 如果需要,可以生成更多。(例如,您的代码设置了 框架来支持局部变量,即使没有。很多 编译器系统地执行此操作,因为大多数调试器都希望这样,而且 如果没有框架,则会感到困惑。)

    关于优化,这取决于编译器。使用g++,
    -O0
    (字母O后跟数字0)关闭所有 优化。然而,这是默认值,因此实际上是什么 你看到了。除了有几个不同级别的 优化,g++支持关闭或打开单个优化。 您可能需要查看完整的列表:
    .

    还要编译这个
    int main(){return 0;}
    以进行比较。我如何在没有优化的情况下编译代码?这甚至不是优化。包括一个在<代码>中的代码(如果0)范围将与代码应该做的相反——这完全不是什么。你假设ASM和C++之间有(或者应该)一对一的相关性是错误的。或者编译器会注意到读它没有意义。
    xorl %eax, %eax
    ret