无法看到 if-else 语句的反汇编代码
Not able to see disassembled code of if-else statements
我想看看用 C 编写的 if-else 程序在 GDB 中的反汇编是什么样子的。为了简单起见,我创建了以下代码:
#include<stdio.h>
int main()
{
if(5==6)
printf("They are equal");
else
printf("Not equal");
return 0;
}
我知道反汇编的一些基础知识,所以我期待出现“test”或“je”指令,但它显示了以下反汇编代码:
Dump of assembler code for function main:
0x0000000000001139 <+0>: push rbp
0x000000000000113a <+1>: mov rbp,rsp
0x000000000000113d <+4>: lea rdi,[rip+0xec0] # 0x2004
0x0000000000001144 <+11>: mov eax,0x0
0x0000000000001149 <+16>: call 0x1030 <printf@plt>
0x000000000000114e <+21>: mov eax,0x0
0x0000000000001153 <+26>: pop rbp
0x0000000000001154 <+27>: ret
现在我认为缺少那些“比较”指令是由于编译器优化。所以我使用 -O0 标志和 gcc 来编译禁用优化的 C 程序。编译后查看反汇编结果如下:
Dump of assembler code for function main:
0x0000000000001139 <+0>: push rbp
0x000000000000113a <+1>: mov rbp,rsp
0x000000000000113d <+4>: lea rdi,[rip+0xec0] # 0x2004
0x0000000000001144 <+11>: mov eax,0x0
0x0000000000001149 <+16>: call 0x1030 <printf@plt>
0x000000000000114e <+21>: mov eax,0x0
0x0000000000001153 <+26>: pop rbp
0x0000000000001154 <+27>: ret
End of assembler dump.
同样,即使在禁用编译器优化后,也没有像“test”或“je”这样的指令。
现在我的问题是:
- 为什么我禁用编译器优化后还是看不到比较指令?
- 如何查看编写代码的原始反汇编?
5==6
是一个常量表达式,因此即使关闭优化,它在编译时仍会计算为 false
。尝试让它们变得不稳定:
#include<stdio.h>
int main()
{
volatile int x = 5, y = 6;
if(x==y)
printf("They are equal");
else
printf("Not equal");
return 0;
}
我想看看用 C 编写的 if-else 程序在 GDB 中的反汇编是什么样子的。为了简单起见,我创建了以下代码:
#include<stdio.h>
int main()
{
if(5==6)
printf("They are equal");
else
printf("Not equal");
return 0;
}
我知道反汇编的一些基础知识,所以我期待出现“test”或“je”指令,但它显示了以下反汇编代码:
Dump of assembler code for function main:
0x0000000000001139 <+0>: push rbp
0x000000000000113a <+1>: mov rbp,rsp
0x000000000000113d <+4>: lea rdi,[rip+0xec0] # 0x2004
0x0000000000001144 <+11>: mov eax,0x0
0x0000000000001149 <+16>: call 0x1030 <printf@plt>
0x000000000000114e <+21>: mov eax,0x0
0x0000000000001153 <+26>: pop rbp
0x0000000000001154 <+27>: ret
现在我认为缺少那些“比较”指令是由于编译器优化。所以我使用 -O0 标志和 gcc 来编译禁用优化的 C 程序。编译后查看反汇编结果如下:
Dump of assembler code for function main:
0x0000000000001139 <+0>: push rbp
0x000000000000113a <+1>: mov rbp,rsp
0x000000000000113d <+4>: lea rdi,[rip+0xec0] # 0x2004
0x0000000000001144 <+11>: mov eax,0x0
0x0000000000001149 <+16>: call 0x1030 <printf@plt>
0x000000000000114e <+21>: mov eax,0x0
0x0000000000001153 <+26>: pop rbp
0x0000000000001154 <+27>: ret
End of assembler dump.
同样,即使在禁用编译器优化后,也没有像“test”或“je”这样的指令。
现在我的问题是:
- 为什么我禁用编译器优化后还是看不到比较指令?
- 如何查看编写代码的原始反汇编?
5==6
是一个常量表达式,因此即使关闭优化,它在编译时仍会计算为 false
。尝试让它们变得不稳定:
#include<stdio.h>
int main()
{
volatile int x = 5, y = 6;
if(x==y)
printf("They are equal");
else
printf("Not equal");
return 0;
}