首页 > 解决方案 > 看不到 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”这样的指令。

现在我的问题是:

标签: cgdbdisassembly

解决方案


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;
}

推荐阅读