【问题标题】:Hard to understand GCC assembly instructions to calculate conditional jump难以理解计算条件跳转的 GCC 汇编指令
【发布时间】:2014-12-29 16:21:41
【问题描述】:

我有以下代码:

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......或者我在这里想错了吗?

【问题讨论】:

    标签: c gcc assembly x86


    【解决方案1】:

    它是jge,因为编译器交换了操作数和条件。它正在做global_count &gt;= a。请注意,0x10(%ebp)a%eaxglobal_count。更复杂的是,at&t 语法本身的操作数颠倒了。

    【讨论】:

    • 当然,但据我了解:cmp src, dest 如果 src (a) 大于或等于 dest (global_count),则跳转,对吗?至少从第一次比较中我是这样理解的。
    • 错了。比较的感觉是dest op src。即使在第一种情况下,它也在做if (a - 0 &lt; 0)cmp 是伪装的sub)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多