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