集会:电话后继续

时间:2017-11-14 10:26:08

标签: assembly call

我正在查看以下代码:

cmp edx edx
jle loc_40234
call some_func
add eax, eax

我想要了解的是,我怎么能达到第四行,因为它不是一个loc(不能跳转到)并且它紧跟一个函数调用。我的意思是,这个电话就像一个跳跃吧?

编辑:好的,我理解基本的想法。我应该指定:这段代码是some_func的一部分(这是我收集的一个循环)。

1 个答案:

答案 0 :(得分:5)

cmp edx,edx会将edx与自身进行比较,因此它始终是"等于",并始终使用jle

将无法从此代码路径到达call(如果它将执行,其他一些代码必须直接跳转到call指令或jle指令标志已经设置为评估为"更大"条件)。

call在技术上与jmp相似,但附加费用较小。它将推送到下一条指令(add)的堆栈地址,所以如果some_func处的代码以某种方式使用堆栈中的这个地址跳转到那里(最常见的函数以ret指令结束,正是这样,弹出堆栈值的顶部并跳转到它,这是返回地址,如果堆栈内容没有损坏且堆栈指针正确),将到达add

当然,如果不检查some_func代码,如果它将返回到add,则无法说出来。