为什么这里用jbe而不是ja?

pol*_*sop 2 c x86 assembly if-statement

int get_cont(int *p1, int *p2) 
{       
    if (p1 > p2)  
        return *p2;
    else
        return *p1;
}
Run Code Online (Sandbox Code Playgroud)

汇编代码为:

    movl    8(%ebp), %eax
    cmpl    12(%ebp), %eax
    jbe    .L2
    movl    12(%ebp), %eax
    movl    (%eax), %eax
    jmp    .L3
Run Code Online (Sandbox Code Playgroud)

为什么使用jbe?条件是p1 > p2. 为什么不使用ja

jajbe都是无符号跳转操作码。为什么编译器反转条件?

chq*_*lie 5

在您的示例中,如果测试在跳转后立即成功,编译器会生成要执行的代码,因此如果测试失败则必须进行跳转,即:如果测试低于或等于 ( ) 则jbe跳转p1 > p2

但请注意,编译器可能会生成任何适当的代码,并且操作数可能会以不同的顺序出现在汇编指令中,从而导致不正确的解释。