我试着检查这段代码在汇编中的作用:
int main(){
if (0){
int x = 2;
x++;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想知道什么if (0)意思?
我在shell g++ -S helloWorld.cpp中使用了shell命令Linux
并获得此代码:
.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
Run Code Online (Sandbox Code Playgroud)
JZ但它在哪里?C++源代码与生成的汇编程序之间没有直接的保证关系.C++源代码定义了某种语义,编译器输出的机器代码将实现那些语义的可观察行为.即使在相同的底层硬件上,编译器如何执行此操作以及它输出的实际代码也会有很大差异; 我会对生成0与之比较的代码的编译器非常失望0,然后在结果相同的情况下进行条件跳转,无论C++源代码是什么.
在您的示例中,代码中唯一可观察的行为是返回
0操作系统.编译器生成的任何内容都必须执行此操作(并且没有其他可观察的行为).您显示的代码不是最佳选择:
xorl %eax, %eax
ret
Run Code Online (Sandbox Code Playgroud)
真的是所有需要的.但是,当然,如果需要,编译器可以自由地生成更多内容.(例如,您的代码设置了一个框架来支持局部变量,即使没有.许多编译器会系统地执行此操作,因为大多数调试器都会期望它,如果没有框架则会感到困惑.)
关于优化,这取决于编译器.使用g ++,
-O0(字母O后跟数字0)将关闭所有优化.这是默认值,因此它实际上是您所看到的.除了具有多个不同级别的优化之外,g ++还支持关闭或打开单个优化.您可能需要查看完整列表:http:
//gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/Optimize-Options.html#Optimize-Options.
编译器将该代码作为死代码消除,例如永远不会运行的代码.你剩下的就是建立堆栈框架并设置函数的返回值.if(0)毕竟,永远不会是真的.如果你想获得JZ,那么你应该做的事情if(variable == 0).请记住,编译器绝不需要实际发出JZ指令,它可以使用任何其他方法来实现相同的操作.将高级语言编译为汇编很少是一种清晰的一对一关联.
| 归档时间: |
|
| 查看次数: |
410 次 |
| 最近记录: |