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

标签 assembly

我有两个关于 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/

相关文章:

assembly - 我的 memset 实现结果仅打印更改,而不是整个结果字符串

cross-platform - 是否可以在汇编程序中使用#ifdef 之类的检查?

swift - 如何解释汇编调用堆栈中的快速(或一般)闭包?

java 窥孔优化初学者编译器

c++ - 在 .text 部分定义只读数据的原因是什么?

X86 机器上的汇编,Windows 与 Linux

debugging - EDB - 如何调试以 i/o 重定向作为参数的程序?

assembly - radare2 中的 ASM 模式搜索

assembly - 故意在 RISC-V 中提出非法指令

c - 将 GCC 内联汇编与采用立即值的指令一起使用