对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,一经查实,立即删除!

相关文章

仿射变换 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…

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

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

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

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

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

今天老师又给了一个程序,让我们分析,记录一下分析过程 程序: #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…

android游戏黑屏,第五人格游戏进不去黑屏解决办法

小编今天给各位玩家朋友们带来的是第五人格游戏进不去黑屏解决办法,很多的玩家朋友们在第五人格更新后都出现了黑屏、游戏无法进入等情况,这应该怎么办呢?小编把解决方法给大家整理在了下方,感兴趣的小伙伴们快来跟小编一起往下看…

线性表----顺序表

线性表的定义 线性表是具有相同数据类型的n个数据元素的有限序列, 逻辑特性 除第一个元素外,每个元素只有一个前驱,除最后一个元素外,每个元素都有一个后继 物理结构 线性表的存储结构有顺序存储结构和链式存储结构&#xff…

树、二叉树、二叉搜索树_检查二叉树是否为BST(二叉搜索树)

树、二叉树、二叉搜索树Description: 描述: This article describes how to check whether a given tree is BST or not? This problem came in coding round of Microsoft. 本文介绍如何检查给定的树是否是BST ? 这个问题来自微软的编码回合。 Probl…

栈溢出利用-----jmp esp

通过jmp esp利用栈溢出&#xff0c;首先我们要找出jmp esp 的地址&#xff0c;因为系统不同&#xff0c;通用jmp esp的地址可能不同&#xff0c;下面的代码是找出jmp esp的地址的&#xff1a; #include<windows.h> #include<iostream.h>#include<tchar.h> i…

android 队列上传图片,话说android端七牛图片上传

七牛图片上传业务流程如下图(这是官方的图)&#xff1a;由上图可知&#xff0c;要想实现图片上传&#xff0c;是要三端进行交互的(我刚刚开始以为只要七牛服务器跟客户端交互就行)接下来步骤如下&#xff1a;1、首先肯定是要有一个七牛的账号&#xff0c;并创建一个空间2、客户…

bst 删除节点_C ++程序查找具有N个节点的BST数量(加泰罗尼亚编号)

bst 删除节点Problem statement: C program to find number of binary search trees with n nodes. 问题陈述&#xff1a; C 程序查找具有n个节点的二进制搜索树的数量。 Input format: single integer n 输入格式&#xff1a;单整数n Constraints: 0<n<15 约束&#x…

android intent实验,Android开发课程实验报告③ intent的使用

Android开发课程实验报告author&#xff1a;065实验四&#xff1a;intent实验报告目录实验目的初学移动应用公开发中的Android开发&#xff0c;实验四的主要内容为intent的使用&#xff0c;通过这一次实验&#xff0c;掌握基本的intent使用方法。具体实验分析实验第一步&#x…

利用xor给shellcode加壳

首先看我们的shellcode&#xff0c;执行弹出cmd 没有shellcode&#xff1a; #include "stdio.h" #include "windows.h" #include <string.h> #include "stdlib.h"int main(int argc, char* argv[]) {printf("begin\n");HINSTAN…

华为mate50鸿蒙,华为Mate50Pro首次曝光,5000mAh+鸿蒙OS+120Hz,太强

自从去年九月份以来&#xff0c;关于华为旗舰的消息越来越少了&#xff0c;主要的原因想必大家也是知道的。现在华为究竟还能不能继续正常发布新旗舰&#xff0c;答案也很微妙&#xff0c;不过我们可以肯定的是&#xff0c;华为绝不会放弃手机业务&#xff0c;这是余承东多次亲…

数数小木块

描述 在墙角堆放着一堆完全相同的正方体小木块&#xff0c;如下图所示&#xff1a; 因为木块堆得实在是太有规律了&#xff0c;你只要知道它的层数就可以计算所有木块的数量了。 现在请你写个程序 给你任一堆木块的层数&#xff0c;求出这堆木块的数量. 输入 第一行是一个整…

信息安全主动攻击和被动攻击_信息安全中的主动和被动攻击 网络安全

信息安全主动攻击和被动攻击安全攻击 (Security Attacks) The attack in cryptography means that our data or sent messages or any kind of information is accessed by some anonymous user without our permission. An attack simply means to alter, destroy, implant or…

线性表---双链表

双链表是单链表的拓展&#xff0c;单链表结点中只有一个指向其后继的指针&#xff0c;双链表有两个结点&#xff0c;一个指向其后继的指针&#xff0c;另一个指向前驱。 为什么要引入双链表呢&#xff1f; 这就要说单链表只有一个指针了&#xff0c;使得单链表只能从结点依次顺…

ppt形状html,PPT如何才能高大上?“形状”在PPT有这些妙用

【PConline 技巧】在PPT中&#xff0c;形状的用法非常丰富。可以说一份优秀的PPT&#xff0c;随处都能见到形状的影子。今天我们就和大家分享几组形状的特殊用法。其实很多时候&#xff0c;你会发现形状有时并不仅仅是形状&#xff01;1.突出标题标题在PPT中的作用不言而喻&…

二分图匹配----匈牙利算法之二

poj 1469 COURSES//题意:现在有p门课程和n个学生,现在需要有由p个学生组成的组织,该组织满足每个学生代表一门课程以及每门课程只能由一个学生代表,//现给出每门课程都有哪些学生可以参加,要求判断是否存在满足题意所需要的组织.//求解二分图的最大匹配数,如果与p相等就输出&qu…

FileSystemObject简介及应用

提示:刚一开始看到有这样的功能&#xff0c;我也受骗了&#xff0c;以为真的可以通过浏览器在访问者的硬盘上创建文件&#xff0c;因为我开始试了一下真的可以&#xff0c;不信你把下面这段代码COPY到一个HTML文件当中再运行一下&#xff01; <script language"JavaScr…