代码之家  ›  专栏  ›  技术社区  ›  S. L.

集合:通话后继续

  •  0
  • S. L.  · 技术社区  · 7 年前

    我正在查看以下代码:

    cmp edx edx
    jle loc_40234
    call some_func
    add eax, eax
    

    我试图理解的是,我怎么能到达第四行,因为它不是loc(不能跳转到),并且它紧跟在函数调用之后。我的意思是,这个电话就像跳伞,对吗?

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

    1 回复  |  直到 7 年前
        1
  •  5
  •   Ped7g    7 年前

    cmp edx,edx 将进行比较 edx 因此,它将始终是“平等的”,并且 jle 总是被拿走。

    这个 call 将无法从此代码路径到达(如果它将执行,则其他一些代码必须直接跳转到 呼叫 指示或 jle公司 已将标志设置为评估为“更大”条件的指令)。

    这个 从技术上讲就像 jmp ,具有较小的附加扭曲。它将推送到下一条指令的堆栈地址( add ),因此如果代码位于 some_func ret 指令,它正好做到了这一点,弹出堆栈顶部的值并跳转到它,这是返回地址,如果堆栈内容没有损坏并且堆栈指针正确),则 将达到。

    当然,没有检查就说不出来 一些函数 代码,如果它返回到那个 添加 .