c - 看不到 if-else 语句的反汇编代码
问题描述
我想看看用 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
现在我认为这些“比较”指令的缺失是由于编译器优化造成的。所以我使用 gcc 的-O0标志来编译禁用优化的 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;
}
推荐阅读
- postgresql - 在处理的 PostgresException 下 TransactionScope 下意外的 Postgres 连接中止
- postgresql - 无法从表中选择变量(Postgresql)
- ruby-on-rails - 提交到数据库后将String转换为Hash
- react-scripts - 全局设置反应脚本
- r - 递归估计的收益波动率
- python-3.x - 我是编码新手,如果我的问题很愚蠢,请原谅我,但我可以知道如何找到每个学生的考试总分吗?
- list - 在初始化程序中只能访问静态成员,错误
- javascript - 具有同一类的多个实例的类构造函数依赖关系
- javascript - 更改网站中的 url 链接语言
- qemu - qemu 从 xml 到本机分配 PCI 设备