函数调用栈帧过程 图解

来源:互联网 发布:sql中时间戳转换 编辑:程序博客网 时间:2024/06/06 05:34

函数的调用栈帧过程的常用指令

1add:加法指令,第一个是目标操作数,第二个是源操作数,格式为:目标操作数= 目标操作数+ 源操作数;

2call:调用函数,一般函数的参数放在寄存器中;

3ret:跳转会调用函数的地方。对应于call,返回到对应的call调用的下一条指令,若有返回值,则放入eax中;

4push:把一个32位的操作数压入堆栈中,这个操作在32位机中会使得esp被减4(字节),esp通常是指向栈顶的,这里顶部是地址小的区域,那么,压入堆栈的数据越多,esp也就越来越小;ebp指向栈底的地址;ebpesp用来维护函数申请的空间。

5pop:与push相反,esp每次加4(字节),一个数据出栈。pop的参数一般是一个寄存器,栈顶的数据被弹出到这个寄存器中;

6mov:数据传送。第一个参数是目的操作数,第二个参数是源操作数,就是把源操作数拷贝到目的一份。

7xor:异或指令,这本身是一个逻辑运算指令,但在汇编指令中通常会见到它被用来实现清零功能。

              xor  eax,eax这种操作来实现mov eax,0,可以使速度更快,占用字节数更少。

8lea:取得第二个参数地址后放入到前面的寄存器(第一个参数)中。

               然而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;}