我有以下代码:
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
......还是我在这里想错了?
> 这很jge
,因为编译器交换了操作数和条件。它正在做global_count >= a
.请注意,0x10(%ebp)
a
,%eax
global_count
。更复杂的是,at&t 语法本身的操作数颠倒了。