条件跳转 - 将c代码与汇编进行比较

时间:2017-02-28 07:48:49

标签: c assembly x86

我试图比较c函数代码与程序集的等价物和条件跳转上的混淆

enter image description here

我查看了jl指令,它说如果<但问题的答案是>=有人可以解释为什么会这样吗?

3 个答案:

答案 0 :(得分:5)

根据我的理解,条件是倒置的,但逻辑是一样的; C源定义

  

如果满足条件,则执行以下块

而汇编源定义

  

如果违反条件,请跳过以下块

这意味着两个实现中的执行流程都是相同的。

答案 1 :(得分:2)

从本质上讲,这个程序集正在做的是在你设置条件时执行你的条件,但是使用负逻辑。

你的病情说:

  

如果a小于b,则返回x。否则,返回y。

汇编代码说的内容(简化):

  

将y移动到缓冲区中以便返回。将b移动到不同的缓冲区。   如果a大于b,则跳到返回步骤。然后你是   回。如果a不大于b,继续执行程序。下一个   step将x分配给返回缓冲区。之后的步骤返回为   正常。

结果是一样的,但过程略有不同。

答案 2 :(得分:1)

程序集逐行执行(代码未包含,因为您将其发布为图像):

foo:
    return_value (eax) = y; // !!!
    temporary_edx = b;      // x86 can't compare memory with memory, so "b" goes to register
    set_flags_by(a-b);      // cmp does subtraction and discards result, except flags
    "jump less to return"   // so when a < b => return y (see first line)
    return_value (eax) = x;
    return

所以要使C代码做同样的事情,你需要:

if (a >= b) { return x; } else { return y; }
BTW,看看翻转是多么容易:

if (a < b) { return y; } else { return x; }

所以没有必要将jl转换为“更少”到C中,你必须追踪每个分支,真正发生的事情,并为每个计算分支找到正确的C面计算,然后“创建“C中的条件以获得双方相同的计算,所以这个任务不是关于”翻译“程序集,而是关于解密asm逻辑+用C重写它。看起来你有点完全错过了这一点,预计你可以通过一些简单的“匹配模式”翻译,而你必须完全解决它。