我有以下代码:
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。还是我想错了?
发布于 2014-12-29 16:31:18
它是jge,因为编译器同时交换了操作数和条件。它在做global_count >= a。注意,0x10(%ebp)是a,%eax是global_count。更复杂的是,at&t语法本身就颠倒了操作数。
https://stackoverflow.com/questions/27692373
复制相似问题