【问题标题】:What is the difference between leave and retleave和ret有什么区别
【发布时间】:2016-10-28 01:47:03
【问题描述】:

我正在尝试反汇编一个包含简单函数的简单程序。这个程序是用 gcc 为 32 位 x86 目标编译的。 该函数通过调用指令调用。 在函数的最后,我看到了一个ret指令,这很正常,但也有一个离开指令。程序的任何地方都没有输入指令。 我想知道这个离开功能是什么......

【问题讨论】:

    标签: gdb elf


    【解决方案1】:

    离开: 离开堆栈区。 离开这是相反的进入。这样进入栈区的资源就被释放了。

    退休: 从程序返回。 Ret 终止执行一个过程并将控制流转移到调用程序。 Ret 有一个可选的字操作数。这表示从堆栈中取出返回地址后,您希望在堆栈上删除的字节数。

    【讨论】:

    • 谢谢,但我的函数中没有输入指令。但我看到函数“push ebp”和“mov %esp,%ebp”的顶部。这两行可能相当于 enter ?
    【解决方案2】:

    相似但不相等。 先读 Enter vs Push

    输入: , 预留一个堆栈区。 使用“Enter”可以保留堆栈的特定内存区域,这是传递参数所需的。字操作数指定要在堆栈上分配的字节数。字节操作数表示当前的过程嵌套。如果字节操作数为 0,则 EBP 被放入堆栈。随后,ESP的值被复制到EBP中,ESP按字操作数递减。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-27
      • 1970-01-01
      • 1970-01-01
      • 2010-10-02
      • 2011-12-12
      • 2010-09-16
      • 2012-03-14
      • 2012-02-06
      相关资源
      最近更新 更多