gpt4 book ai didi

assembly - 下面代码中EBP的作用是什么?

转载 作者:行者123 更新时间:2023-12-02 19:26:27 26 4
gpt4 key购买 nike

我有两个关于 EBP 寄存器的问题。

我了解 ESP 和 EIP。但是,我不太明白为什么要使用 EBP。

在下面的代码中,我将 EBP 寄存器(实际上是 0000000)压入堆栈。然后我将堆栈的内存地址移动到EBP,以便ESP和EBP具有相同的数据。这是序言。有一些代码以系统调用结束。然后我执行相反的操作(尾声),因为“leave”表示我将 EBP 移动到 ESP(由于序言,这些值是相同的),然后将堆栈的最后一个值(即 EBP,即 00000000)弹出到 EBP。这使得 EBP 的值与序言之前发生的值相同。

为什么有人会这样做?重点是什么?请简单回答一下!请记住,我不明白 EBP(帧指针)实际上是做什么的。

编辑:或者这是在函数中有效备份堆栈(ESP)的一种方法?换句话说:程序可以对堆栈执行其操作,并且“原始堆栈”将始终存在于 EBP 中。然后当程序结束时,EBP 恢复到之前的状态。它是否正确?如果是这样,尾声只是一个整理程序?

另外,AIUI,我可以使用“enter”来替换“push ebp/mov ebp, esp”。然而,当我尝试在 nasm 中编译时,我收到“错误:操作码和操作数的无效组合”“leave”工作正常; “输入”则不然。正确的语法是什么?

谢谢!

Example:

push ebp
mov, ebp, esp

[some code here]
int 0x80

leave
ret

最佳答案

EBP 形成对堆栈中变量的固定引用点:主要是函数的所有参数、函数的所有局部参数以及最后的返回地址。通过这个固定点,函数可以几乎随机地增长/改变它的堆栈,从任何地方跳转到函数尾声并将堆栈指针恢复到原始位置。

这个概念几乎是强制性的,因为原始 8086 代码不允许堆栈指针与 mov ax, [sp + 10] 中的位移一起使用,而只能与 一起使用推送弹出。对除顶部元素之外的任何其他元素的引用都需要使用 mov xx, [bp + 10] 来完成。

关于assembly - 下面代码中EBP的作用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22516370/

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