今天我们来看一下函数的调用过程与栈帧。

我们通过一段简单的代码和图示来介绍这个过程:

#include<stdio.h>
int add(int x,int y)
{int z = x + y;return z;
}
int main()
{int a = 0xaaaaaaaa;int b = 0xbbbbbbbb;int c = add(a, b);printf("run here!%d\n", c);return 0;
}

将这个过程用图示表示出来:

在cpu中,两个寄存器EBP、ESP分别指向栈的底端和顶端。

当程序开始运行时,先会创建两个变量a、b,

这时在栈中就会创建两段空间,地址中分别存放a和b的值,且由于a比b先创建,所以a先入栈,

即a的地址比b的地址高。

而EIP中存放的是main代码。

当进行运算时,在栈中会生成两个临时变量a、b(变量a、b的拷贝),

而临时变量生成的位置则是在栈顶,且参数赋值的顺序是从右向左进行。

此时转到汇编代码时,会出现很多命令,如:mov、call、add等命令代码。

mov eax,dword ptr [ebp-8]

这个操作是指:

将b([ebp-8]在这里指的是b)移动到eax寄存器中,eax是cpu中的寄存器,然后把eax里的b压入栈中,此时ESP寄存器指向b的位置。

mov ecx,dword ptr[ebp-4]

这段命令代码和上面的操作一致,不同的是这里的[ebp-4]指的是a。

这里的-4和-8指的是相对于ebp的偏移量。

call指令会执行两段操作:

1、将当前指令的下一条指令的地址压入栈中;

2、跳转至目标函数的地址开始过程调用。

所以当执行call操作时,会跳转到add函数中,执行后续的操作。

再接下来会执行一段ebp和esp指向位置的改变:

mov ebp,esp

这里指ebp将指向esp所指向的地方。

esp-44h

这里指将esp往小地址移。
完成这两步操作后,就完成了新的ebp和esp的指向。

再经过一系列操作后,我们会得到返回值。

其中会执行pop操作,释放之前临时变量所创建的空间。

这时过程调用会结束。

转载于:https://www.cnblogs.com/xiefei777/p/7779405.html

函数的调用过程——栈帧。相关推荐

  1. 代码 or 指令,浅析ARM架构下的函数的调用过程

    摘要:linux程序运行的状态以及如何推导调用栈. 1.背景知识 1.ARM64寄存器介绍: 2.STP指令详解(ARMV8手册): 我们先看一下指令格式(64bit),以及指令对于寄存机执行结果的影 ...

  2. JAVA学习第五篇--java中对象的创建过程以及函数的调用过程

    下面本文将详细介绍java语言中对象的创建过程,以及函数的调用过程. class Person{public String name="zhao";public int ege;p ...

  3. 使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程

    标 题: [原创]使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程. 作 者: shayi 时 间: 2015-02-12,05:19:54 链 ...

  4. 案例一: 使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程。 首先用文本编辑器写一个C++源程序名为StackFrame.cpp ,代码如下:

    案例一: 使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程. 首先用文本编辑器写一个C++源程序名为StackFrame.cpp ,代码如下: 1 ...

  5. 【汇编语言与计算机系统结构笔记09】程序栈,(x86-32)过程调用,栈帧,寄存器使用惯例

    本次笔记内容: 10.栈与过程调用的机器表示-1 11.栈与过程调用的机器表示-2 12.实验 文章目录 前言 x86-32的程序栈 压栈操作 出栈操作 过程调用 基于栈的编程语言 栈帧 x86-32 ...

  6. ebp 函数堆栈esp_函数堆栈调用过程

    从内存的角度详细的分析C语言中的函数调用过程: 首先写一个测试用的代码: #include int add(int x, int y) { int z = 0; z = x + y; return z ...

  7. c语言 中断 局部变量 not allocated,C语言(函数)调用过程(略译)

    C语言(函数)调用过程 Introduction A calling sequence is the conventional sequence of instructions that call a ...

  8. Linux的open函数的调用过程,Linux 中open系统调用实现原理

    用户空间的函数在内核里面的入口函数是sys_open 通过grep open /usr/include/asm/unistd_64.h查找到的 #define __NR_open2 __SYSCALL ...

  9. mysql函数如何调用过程_MySQL调用存储过程和函数

    存储过程和存储函数都是存储在服务器端的 sql 语句集合.要想使用这些已经定义好的存储过程和存储函数就必须要通过调用的方式来实现. 存储过程通过 CALL 语句来调用,存储函数的使用方法与 MysqL ...

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

    esp:扩展栈指针寄存器,是指针寄存器的一种,用于存放函数栈顶指针(栈顶指针) ebp:扩展基址指针寄存器,也被称为帧指针寄存器,用于存放函数栈底指针(栈底指针). esp和ebp有什么关系呢? eb ...

最新文章

  1. VPLS(Virtual Private LAN Service)
  2. 教你清楚了解JAVA动态代理
  3. SpringBoot2.x开发案例之整合Quartz任务管理系统
  4. ☆【CodeForces - 764C】Timofey and a tree (思维题,树的性质)
  5. LeetCode 2020 力扣杯全国秋季编程大赛(656/3244,前20.2%)
  6. linux 添加sftp用户
  7. java扑克牌排序_扑克牌排列 运用List ArrayList Arrays
  8. 没有绝对的技术,只有不停的创新
  9. 【LogStash】LogStash 配置后无法启动的问题
  10. SAP License:HP面试手记
  11. 一个很好用的桌面取色器和一个在线取色器
  12. 灰色模型及matlab算法
  13. Writeup for 0CTF2017 web
  14. 安装软件出现错误处理:internal error2503/2502
  15. CF896C Willem, Chtholly and Seniorious(珂朵莉树)
  16. 基于html5手机移动端对话框特效
  17. SSD固态硬盘能否恢复--争议
  18. 分布式系统中CAP原理
  19. Android应用解析包错误原因的总结(不定时更新)
  20. Android RIL学习

热门文章

  1. 周报中竟然出现学习时间,主管怎么当的
  2. 麒麟LINUX(飞腾ARM)更新软件源
  3. Windows下,BAT文件中使用XCopy复制整个目录
  4. UBUNTU启动到BusyBox,怎么办?
  5. python中RGB缓冲区红蓝颠倒的解决办法
  6. 相同风格,牛仔裤和青花瓷风行世界
  7. 进程标识符及fork
  8. linux卸载rpm安装的golang,linux下go安装/卸载重装-Go语言中文社区
  9. mysql linux 表名区分大小写吗_MySQL在linux下的表名如何不区分大小写
  10. php 解析字符串编码方式 GB2312 UTF8