编译环境:Windows 10 + VS2015。 0、引言 函数调用的过程实际上也就是一个中断的过程,本文演示和深入分析参数入栈、函数跳转、保护现场、恢复现场等函数调用过程。 首先对三个常用的寄存器进行说明: EIP:指令指针,即指向下一条即将执行的指令的地址。 EBP:基址 ...
这里以一个简单的C语言代码为例,来分析函数调用过程 代码: 首先说明,在堆栈中变量分布是从高地址到低地址分布,EBP是指向栈底的指针,在过程调用中不变,又称为帧指针。ESP指向栈顶,程序执行时移动,ESP减小分配空间,ESP增大释放空间,ESP又称为栈指针。 下面来逐步分析函数的调用过程 .函数main执行,main各个参数从右向左逐步压入栈中,最后压入返回地址 .执行第 行, 个参数以从左向右的 ...
2012-07-20 15:11 0 18969 推荐指数:
编译环境:Windows 10 + VS2015。 0、引言 函数调用的过程实际上也就是一个中断的过程,本文演示和深入分析参数入栈、函数跳转、保护现场、恢复现场等函数调用过程。 首先对三个常用的寄存器进行说明: EIP:指令指针,即指向下一条即将执行的指令的地址。 EBP:基址 ...
下面一段C程序: 如果在编译时加上-g选项,那么用objdump反汇编时可以把C代码和汇编代码穿插起来显示,这样C代码和汇编代码的对应关系看得更清楚。反汇编的结果很长,以下只列出我们关心的部分。 要查看编译后的汇编代码,其实还有一种办法是gcc -S main.c ...
在x86的计算机系统中,内存空间中的栈主要用于保存函数的参数,返回值,返回地址,本地变量等。一切的函数调用都要将不同的数据、地址压入或者弹出栈。因此,为了更好地理解函数的调用,我们需要先来看看栈是怎么工作的。 栈是什么? 简单来说,栈是一种LIFO形式的数据结构,所有的数据都是后进先出。这种 ...
在x86的计算机系统中,内存空间中的栈主要用于保存函数的参数,返回值,返回地址,本地变量等。一切的函数调用都要将不同的数据、地址压入或者弹出栈。因此,为了更好地理解函数的调用,我们需要先来看看栈是怎么工作的。 栈是什么? 简单来说,栈是一种LIFO形式的数据结构,所有的数据都是后进先出。这种 ...
在x86的计算机系统中,内存空间中的栈主要用于保存函数的参数,返回值,返回地址,本地变量等。一切的函数调用都要将不同的数据、地址压入或者弹出栈。因此,为了更好地理解函数的调用,我们需要先来看看栈是怎么工作的。 栈是什么? 简单来说,栈是一种LIFO形式的数据结构 ...
堆栈中的变量分布是从高地址到低地址分布,EBP是指向栈底的指针,在过程调用中不变,又称为帧指针。ESP指向栈顶,程序执行时移动,ESP减小分配空间,ESP增大释放空间,ESP又称为栈指针。 下面逐步分解函数的调用过程: 1、函数main执行,main各个参数从右向左逐步压入栈中 ...
http://gmd20.blog.163.com/blog/static/168439232015475525227/ ...
函数调用过程分析 1. 静态变量和初始化 2. 堆栈帧 一个函数分为:函数序、函数体、函数跋 函数序:执行启动工作,如:为局部变量保存堆栈中的内存 函数跋:在函数即将返回之前清理堆栈。 函数体:执行工作的地方 0x3cfc表示寄存器d2至d7、a2到a5中的值需要被保存 ...