EBP循址

Posted codexlx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EBP循址相关的知识,希望对你有一定的参考价值。

1.概述

ESP寻址方式有弊端:

  • 因为ESP中存储的时当前堆栈的地址,所以如果我们向栈顶压入数据时,栈顶位置的值必定发生变化,此时如果再用ESP寻找原来的变量,需要修正才能正确找到。

因此用到了EBP寻址:

  ESP中存储的是当前栈顶指针的值。

  EBP存储的是栈底指针的值

EBP寻址的思路:

  • 把EBP放到原来的ESP的位置,同时让ESP向上移动一段距离;
  • 这样新的ESP-EBP中间这段空间就相当于一块自己开辟的内存;
  • 当要向这段空间PUSH数据或者其他操作的话,会发生改变的只有ESP的值,而EBP的值是不变的

  技术图片

 

 3.举例:以一个简单的加法函数为例

(1)函数执行前先向栈中PUSH自己需要的参数:

  此时栈顶指针存储的是当前call指令下一步指令的地址

  技术图片

 

 (2)将EBP存入栈顶

  这一步的作用是先存储EBP的值,在函数执行结束以后可以从这里拿回EBP的值

  技术图片

 

 (3)让ESP与EBP相等,再让ESP减去需要的字节数。即可实现为当前函数开辟一个指定的空间

  技术图片

 

  技术图片

 

 (4)执行函数操作

在如果函数内有PUSH操作以及数值操作,可以把用到的数值放到上面开辟的16字节的中。

同时以EBP为参考获取到传进来的参数值执行加法操作

技术图片

 

(5) 函数体内的函数执行结束以后,让ESP回到原位,同时把EBP的值从栈中POP出来,这样整个函数执行结束后,ESP的值仍然指向的是CALL指令下一步指的地址。因此做到的堆栈平衡

技术图片

(6)ESP回到原位,堆栈平衡

技术图片

 

 

 

 

以上是关于EBP循址的主要内容,如果未能解决你的问题,请参考以下文章

在不需要清理时避免“push ebp, mov esp, ebp”序言

关于汇编中push ebp和pop ebp指令的解释

GetThreadContext 返回 EBP = 0

GCC 内联汇编错误:表达式后出现垃圾 `(%ebp)+4'

cmpl $0x1, -0x18(ebp) 在 AT&T 中有啥作用? [复制]

at&t 汇编代码 ebp 注册未定义行为