无法看到 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;
}