很难理解GCC汇编指令来计算条件跳转

时间:2014-12-29 16:21:41

标签: c gcc assembly x86

我有以下代码:

if(( a<0 ) || ( a>global_count ))  //global_count is a global int
{
    print error;
}

normal_flow
    ...

现在,这是GCC生成的汇编程序:

cmpl 0x0 , 0x10(%ebp) //first check
js print_error
mov 0x8(%ebp) , %eax
mov 0x8(%eax) , %eax 
cmp 0x10(%ebp) , %eax //second check
jge normal_flow
print_error

我不明白为什么jge?我看到它使用的是mov,而不是movl,但我认为在这种情况下它应该是jle或者如果我们更改跳转目标则应该jg ...或者我在这里想错了?

1 个答案:

答案 0 :(得分:3)

它是jge,因为编译器交换了操作数和条件。它在做global_count >= a。请注意,0x10(%ebp)a%eaxglobal_count。更复杂的是,在语法本身中,操作数会反转。