【问题标题】:assembly: continuing after call组装:通话后继续
【发布时间】:2017-11-14 10:26:07
【问题描述】:

我正在查看以下代码:

cmp edx edx
jle loc_40234
call some_func
add eax, eax

我想了解的是,我什至如何才能到达第四行,因为它不是 loc(不能跳转到)并且它紧跟在函数调用之后。我的意思是,这个调用就像一个跳跃,对吧?

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

【问题讨论】:

  • 如果some_func 中的代码执行call some_func,则形成称为“递归”的逻辑模式。 CPU 不关心任何方式,不知道 func/procedure 概念,它只是按照指示跳转指令,如果递归太深,堆栈将从存储的返回地址溢出(每个 @ 再加一个987654324@).
  • 好的,再次感谢!

标签: assembly call


【解决方案1】:

cmp edx,edx 会将edx 与自身进行比较,所以它总是“相等”,并且总是采用jle

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

call 在技术上与jmp 相似,只是略有不同。它将推送到下一条指令的堆栈地址(add),因此如果some_func 处的代码会以某种方式使用堆栈中的此地址跳转到那里(最常见的函数以ret 指令结尾,正是这样做的,弹出栈顶值并跳转到它,即返回地址,如果栈内容没有损坏且栈指针正确),就会到达add

当然不检查some_func代码是不可能的,如果它会返回那个add

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多