我试图比较c函数代码与程序集的等价物和条件跳转上的混淆
我查看了jl
指令,它说如果<但问题的答案是>=
有人可以解释为什么会这样吗?
答案 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重写它。看起来你有点完全错过了这一点,预计你可以通过一些简单的“匹配模式”翻译,而你必须完全解决它。