函数调用栈帧过程 图解
来源:互联网 发布:sql中时间戳转换 编辑:程序博客网 时间:2024/06/06 05:34
函数的调用栈帧过程的常用指令
1、add:加法指令,第一个是目标操作数,第二个是源操作数,格式为:目标操作数= 目标操作数+ 源操作数;
2、call:调用函数,一般函数的参数放在寄存器中;
3、ret:跳转会调用函数的地方。对应于call,返回到对应的call调用的下一条指令,若有返回值,则放入eax中;
4、push:把一个32位的操作数压入堆栈中,这个操作在32位机中会使得esp被减4(字节),esp通常是指向栈顶的,这里顶部是地址小的区域,那么,压入堆栈的数据越多,esp也就越来越小;ebp指向栈底的地址;ebp和esp用来维护函数申请的空间。
5、pop:与push相反,esp每次加4(字节),一个数据出栈。pop的参数一般是一个寄存器,栈顶的数据被弹出到这个寄存器中;
6、mov:数据传送。第一个参数是目的操作数,第二个参数是源操作数,就是把源操作数拷贝到目的一份。
7、xor:异或指令,这本身是一个逻辑运算指令,但在汇编指令中通常会见到它被用来实现清零功能。
用 xor eax,eax这种操作来实现mov eax,0,可以使速度更快,占用字节数更少。
8、lea:取得第二个参数地址后放入到前面的寄存器(第一个参数)中。
然而lea也同样可以实现mov的操作,例如:
lea edi,[ebx-0ch]
方括号表示存储单元,也就是提取方括号中的数据所指向的内容,然而lea提取内容的地址,这样就实现了把(ebx-0ch)放入到了edi中,但是mov指令是不支持第二个操作数是一个寄存器减去一个数值的。
下面是函数调用栈帧过程的源代码和图解
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<math.h>int Add(int x, int y){int z=0;z = x + y;return z ;}int main(){int a = 1;int b = 2;int ret = Add(a, b);printf("ret=%d\n", ret);system("pause");return 0;}
- 函数调用栈帧过程 图解
- 函数栈帧(函数调用过程详解)
- 函数调用过程(栈帧)的剖析和图解
- 函数调用栈 剖析+图解
- 函数调用栈 剖析+图解
- 函数调用栈 剖析+图解
- 函数栈帧图解
- 函数调用过程栈帧变化详解
- 函数调用过程栈帧变化详解
- 函数栈帧的调用过程
- 描述函数栈帧的调用过程
- 函数调用过程及栈帧分析
- 栈帧与函数调用过程分析
- 函数调用过程的栈帧
- 栈帧与函数调用过程
- java调用存储过程图解
- 函数调用的过程-栈
- c函数调用过程原理及函数栈帧分析
- 2017-11-13
- 20171113关于类模版和和其特化的格式问题
- 403 Forbidden问题
- Thread
- 装饰器
- 函数调用栈帧过程 图解
- 【Unity Shader入门练习】Bloom效果
- 二叉树的线索化及其迭代器
- 【量化小讲堂-Python&Pandas系列11】法码三因子选股模型,有多少人可以跑赢
- FPGA静态时序分析基本概念
- 南邮ctf逆向最后一题
- Android开发之基类Object官方文档翻译
- String,StringBuffer,StringBuilder之间的差别
- https概述