对esp和ebp分析来了解函数的调用过程

esp:扩展栈指针寄存器,是指针寄存器的一种,用于存放函数栈顶指针(栈顶指针)
ebp:扩展基址指针寄存器,也被称为帧指针寄存器,用于存放函数栈底指针(栈底指针)。

esp和ebp有什么关系呢?

ebp只是存取某时刻的esp,这个时刻就是进入一个函数内后,cpu会将esp的值赋给ebp,此时就可以通过ebp对栈进行操作,比如获取函数参数,局部变量等,实际上使用esp也可以,只是esp可能会变化,去数据的时候很不方便

下面我们通过一个例子来说明:


#include "stdio.h"int function_add(int a,int b);
int main()
{int a=1,b=1,sum=0;sum=function_add(a,b);printf("sum=%d",sum);return 0;
}
int function_add(int a,int b)
{return a+b;}

这段程序的功能是定义一个函数,实现两个参数相加,然后打印出来,下面来分析,

	int a=1,b=1,sum=0;sum=function_add(a,b);

这两句反汇编如下:

7:  int a=1,b=1,sum=0;
00401038 C7 45 FC 01 00 00 00   mov         dword ptr [ebp-4],1 		;偏移地址为[ebp-4]存放1
0040103F C7 45 F8 01 00 00 00   mov         dword ptr [ebp-8],1		;偏移地址为[ebp-8]存放1
00401046 C7 45 F4 00 00 00 00   mov         dword ptr [ebp-0Ch],0	;偏移地址为[ebp-0ch]存放0
8:        sum=function_add(a,b);
0040104D 8B 45 F8             mov         eax,dword ptr [ebp-8]				;eax的值设置为1
00401050 50                        push        eax											;压入栈
00401051 8B 4D FC             mov         ecx,dword ptr [ebp-4]				;ecx的值设置为1
00401054 51                  	 	push        ecx											;入栈
00401055 E8 AB FF FF FF       call        @ILT+0(function_add) (00401005)
0040105A 83 C4 08             add         esp,8
0040105D 89 45 F4             mov         dword ptr [ebp-0Ch],eax

当执行到这段代码会调到function_add函数执行

  call        @ILT+0(function_add) (00401005)

这段一共push两次,假设在没有这两次push前,设esp=M,push两次后,esp=M-8
在这里插入图片描述
执行call语句 esp=M-12
function_add反汇编的代码为:

12:   int function_add(int a,int b)
13:   {
004010A0 55                   push        ebp
004010A1 8B EC                mov         ebp,esp
004010A3 83 EC 40             sub         esp,40h
004010A6 53                   push        ebx
004010A7 56                   push        esi
004010A8 57                   push        edi
004010A9 8D 7D C0             lea         edi,[ebp-40h]
004010AC B9 10 00 00 00       mov         ecx,10h
004010B1 B8 CC CC CC CC       mov         eax,0CCCCCCCCh
004010B6 F3 AB                rep stos    dword ptr [edi]
14:       return a+b;
004010B8 8B 45 08             mov         eax,dword ptr [ebp+8]
004010BB 03 45 0C             add         eax,dword ptr [ebp+0Ch]
15:
16:   }
004010BE 5F                   pop         edi
004010BF 5E                   pop         esi
004010C0 5B                   pop         ebx
004010C1 8B E5                mov         esp,ebp
004010C3 5D                   pop         ebp
004010C4 C3                   ret

我们可以看到在函数前面,首先将ebp压入栈,然后将esp的值赋值给ebp,此时
esp=M-16,ebp的值和esp相同

push        ebp
mov         ebp,esp

此时栈里情况为:
在这里插入图片描述

在函数里,都是通过ebp对栈的数据进行操作的,比如获取参数的值,

004010B8 8B 45 08             mov         eax,dword ptr [ebp+8]
004010BB 03 45 0C             add         eax,dword ptr [ebp+0Ch]

因为在函数里,esp的值可能是变化的,ebp的值不变,通过ebp来操作数据很方便
在最后:

004010C1 8B E5                mov         esp,ebp
004010C3 5D                   pop         ebp

将esp,ebp的值变成调用function_add之前的值,这样看起来只是实现函数的功能,其他并没有啥变化,再使用ret语句,返回去,然后继续往下执行语句

0040105A 83 C4 08             add         esp,8

总结:

  1. esp始终指向栈顶,ebp只要在调用函数时,取值为栈顶,这样可方便对数据的操作
  2. 函数调用时,EBP的值入栈,然后ESP的值传给EBP。函数调用结束后,EBP将值传回ESP,ESP又指向了原来的栈顶地址。这样看起来只是实现函数的功能,其他看起来没有变化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/380455.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

放大镜,缩小镜

今天看了 CSDN上的很多文章,有很经典的,也有比较一般的,加上昨天我们老大发给我看的一些CEO的讲话内容的文章,突然发现,不知道是这个行业内部的问题还是整个国内评论家门的问题,在讨论和研究一个问题的时候…

SEO你所不知道的!!SEO资源人脉才是王道

头脑在个人身上,思维在自己脑中,自己为什么要老是听从别人的话语呢?别人让你往西,你就直奔西处吗?这是我以前犯下的一个错误,总感觉自己好像就是再为 别人而用,自己的理想目标何在?因为刚入社会,遇到这样…

仿射变换 c语言,c语言数字图像处理(三):仿射变换

仿射变换及坐标变换公式几何变换改进图像中像素间的空间关系。这些变换通常称为橡皮模变换,因为它们可看成是在一块橡皮模上印刷一幅图像,然后根据预定的一组规则拉伸该薄膜。在数字图像处理中,几何变换由两个基本操作组成:(1)坐标…

C和汇编混合编程----实现浮点数的加减乘除

加法 C程序: #include "stdio.h"int main() {float a1.0;float b2.34;float c;cab;printf("c%f",c);return 0; }反汇编之后,实现加法的关键程序 5: float a1.0; 00401028 C7 45 FC 00 00 80 3F mov dword ptr [eb…

java删除指定索引元素_将对象/元素添加到列表中的Java指定索引处

java删除指定索引元素We have to create a List and add objects/elements to the List and given indexes in java. 我们必须创建一个List并将对象/元素添加到该List中,并在Java中添加给定的索引。 To add any object/element at given index to the List, we use…

使用ActiveX读取客户端mac地址

//保存为html文件<HTML><HEAD><TITLE>获取客户端MAC和用户名</TITLE><META http-equivContent-Type content"text/html; charsetgb2312"><SCRIPT languageJScript event"OnCompleted(hResult,pErrorObject, pAsyncContext)&qu…

【Wordpress】分享500多款国外WordPress经典主题 其之三

从国外网站上淘来的WordPress主题&#xff0c;以前都是放在本人博客xcodeland.mooo.com上的后来空间挂掉了就转到这里来与大家分享。 modernclean 下载地址 just-business 下载地址 redrum 下载地址 aneducation 下载地址 artsie 下载地址 eveningalone 下载地址 wasabi …

python 微秒_Python程序可显示当前时,分,秒和微秒

python 微秒In the below example – we are implementing a python program to print current hour, minute, second and microsecond. 在下面的示例中-我们正在实现一个python程序来打印当前时&#xff0c;分&#xff0c;秒和微秒 。 Steps: 脚步&#xff1a; Import the d…

终于知道RTM的含义了

从关注VS 2005开始&#xff0c;注意到RTM、RC这几个缩写&#xff0c;一直没找到是什么意思。今天终于知道了含义&#xff1a;RTM&#xff1a;Release To Manufacturing意味着开发工作已结束, RTM 版将提供给发行商、OEM 硬件厂商、驱动程序开发者、独立软件开发者等。RC&#x…

C和混编混合编程----strcpy缓存溢出原理

今天老师给了一到程序&#xff0c;让我们分析分析原理&#xff0c;关于strcpy缓存溢出原理的&#xff0c;反汇编一遍遍调试&#xff0c;终于看明白了&#xff0c;记录一下 C程序&#xff1a; #include "string.h" #include "stdio.h" char *shellcode&quo…

16进制的简单运算

描述 现在给你一个16进制的加减法的表达式&#xff0c;要求用8进制输出表达式的结果。 输入 第一行输入一个正整数T&#xff08;0< T<100000&#xff09; 接下来有T行&#xff0c;每行输入一个字符串s&#xff08;长度小于15)字符串中有两个数和一个加号或者一个减号&…

逝去的大学生活自己丢了什么

1.一个HP电脑包挂在外面的阳台 2.一个蚊帐 3.乱七八糟的垃圾 4.两双篮球鞋 5.一台电脑桌送给了阿姨&#xff0c;不到一会儿就消失不见了 6.一辆自信车给了好朋友 7.三个水果筐给了阿姨 这么大方的丢东西丢的最多的一次 祭奠我逝去的大学&#xff0c;祭奠我丢失的东西&#xff0…

android 中文api 在线测试,android webview测试方法

利用chromedriver操作webview1.创建chrome serverchromedriver --url-basewd/hub --port9515 --adb-port50372.创建sessionPOST http://127.0.0.1:9515/wd/hub/session参数&#xff1a;{"desiredCapabilities":{"chromeOptions":{"androidPackage&quo…

几篇介绍在页面中引用脚本文件的技术文档

在一个页面中包含一个脚本文档是多么简单的一件事&#xff0c;但今天看了几篇文章后&#xff0c;才发现在一个这么简单的功能也有这么多的技巧可谈&#xff0c;以下是这几篇文章挣脱浏览器的束缚&#xff08;1&#xff09; - 前言挣脱浏览器的束缚&#xff08;2&#xff09; - …

Java StringBuffer insert(int offset,String s)方法,带示例

StringBuffer类insert(int offset&#xff0c;String s) (StringBuffer Class insert(int offset , String s)) This method is available in package java.lang.StringBuffer.insert(int offset, String s). 软件包java.lang.StringBuffer.insert(int offset&#xff0c;Strin…

C和汇编混合编程--------函数调用后ebp、esp值问题

今天老师又给了一个程序&#xff0c;让我们分析&#xff0c;记录一下分析过程 程序&#xff1a; #include "stdio.h" #include "string.h"char *shellcode"\x64\x65\x66\x67\x68\x69\x70\x71\x05\x10\x40\x00"; void fun1(int a, int b) {print…

C小加 之 随机数

描述 ACM队的“C小加”同学想在学校中请一些同学一起做一项问卷调查&#xff0c;为了实验的客观性&#xff0c;他先用计算机生成了N个1到1000之间的随机整数&#xff08;0< N≤100&#xff09;&#xff0c;对于其中重复的数字&#xff0c;只保留一个&#xff0c;把其余相同…

How to use fb.data.query to get friends info?

参考代码1&#xff1a; varquery FB.Data.query(select uid, first_name, last_name, work, from user where uid{0}, response.id);query.wait(function(rows) {varloginData {fb_uid: rows[0].uid, first_name: rows[0].first_name, last_nam…

android listview ontouchlistener,Android ListView监听滑动事件的方法(详解)

ListView的主要有两种滑动事件监听方法&#xff0c;OnTouchListener和OnScrollListener1、OnTouchListenerOnTouchListener方法来自View中的监听事件&#xff0c;可以在监听三个Action事件发生时通过MotionEvent的getX()方法或getY()方法获取到当前触摸的坐标值&#xff0c;来对…

获得jmp esp地址

对于大部分想要利用缓冲区溢出的人来说&#xff0c;jmp esp就再熟悉不过了&#xff0c;我最近发现网上将如何如何利用它的人太多太多&#xff0c;可是就是没人告诉在shellcode 中到底jmp esp的地址在哪&#xff0c;有些直接给除了它的地址可是由于jmp esp随系统的不同地址也不同…