gpt4 book ai didi

c - 程序集 x86 - "leave"指令

转载 作者:太空狗 更新时间:2023-10-29 16:33:25 32 4
gpt4 key购买 nike

据说“离开”指令类似于:

movl %ebp, %esp
popl %ebp

我了解 movl %ebp, %esp 部分,它用于释放存储的内存(如 this question 中所述)。

但是 popl %ebp 代码的目的是什么?

最佳答案

LEAVE 对应于 ENTERENTER 指令通过首先将 EBP 压入堆栈然后将 ESP 复制到 EBP 来建立堆栈帧,所以 LEAVE 必须做相反的事情,即将 EBP 复制到 ESP 然后从堆栈中恢复旧的 EBP .

请参阅 Intel's Software Developer's Manual 中名为 block 结构语言的过程调用 的部分如果您想了解有关 ENTERLEAVE 工作原理的更多信息,请阅读第 1 卷。


enter n,0 完全等同于(并且应该替换为)

push  %ebp
mov %esp, %ebp # ebp = esp, mov ebp,esp in Intel syntax
sub $n, %esp # allocate space on the stack. Omit if n=0

leave 完全等同于

mov   %ebp, %esp     # esp = ebp,  mov  esp,ebp in Intel syntax
pop %ebp

enter 非常慢,编译器不使用它,但是 leave 没问题。 (http://agner.org/optimize)。编译器确实会使用 leave 如果它们完全生成堆栈帧(至少 gcc 会这样做)。但是如果 esp 已经等于 ebp,那么只pop ebp 是最有效的。

关于c - 程序集 x86 - "leave"指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29790175/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com