请假和请假有什么区别

Bob*_*421 6 gdb elf

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

小智 5

离开: 离开堆栈区域。离开与进入相反。因此,通过 Enter 保留的堆栈区域被释放。

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

  • 谢谢,但我的函数中没有输入指令。但我看到函数“push ebp”和“mov %esp,%ebp”的顶部。这两行可能相当于 Enter ? (3认同)

Ofe*_*lon 2

enter是缓慢的同义词

push ebp
mov  ebp, esp
sub  esp, imm
Run Code Online (Sandbox Code Playgroud)

leave是一个相当快的同义词

mov  esp, ebp
pop  ebp
Run Code Online (Sandbox Code Playgroud)

您不必拥有一个enter即可使用leave. 它只是堆栈清理寄存器舞蹈的简写。