我正在看下面的代码:
cmp edx edx
jle loc_40234
call some_func
add eax, eax
Run Code Online (Sandbox Code Playgroud)
我想要了解的是,我怎么能到达第四行,因为它不是一个loc(不能跳转到)并且它紧跟一个函数调用.我的意思是,这个电话就像一个跳跃吧?
编辑:好的,我理解基本的想法.我应该指定:这段代码是some_func的一部分(这是我收集的一个循环).
cmp edx,edx将edx与自身进行比较,因此它将始终"平等",并且jle始终采用.
在call将这个代码路径没有达到(如果它永远不会执行,其他的一些代码必须直接在跳转call指令,或在jle已设置评价为"大"状态标志的指令).
从call技术上讲jmp,它具有额外的小扭曲.它将推送到下一条指令(add)的堆栈地址,所以如果代码在some_func某种程度上会使用堆栈中的这个地址跳转到那里(最常见的函数以ret指令结束,这正是如此,弹出堆栈值的顶部并跳转到它,这是返回地址,如果堆栈内容没有损坏且堆栈指针正确),add将到达.
当然some_func,如果没有检查代码,它是不可能的,如果它将返回到那个add.