【C++】函数堆栈调用(含一些简单汇编指令)

【C++】函数堆栈调用(含一些简单汇编指令)

关于汇编的一些知识点+指令

Windows:Inter x86

Linux:AT&T

指令:

①mov 移动数据

例如:mov , dword ptr[ebp-4] , 0ah;

(ebp:栈底指针寄存器)

②lea 移动地址

例如:lea , eax , [ebp-4];

③push 压栈

例如:push 0ah;

④pop 出栈

例如:pop eax; => eax=pop(); 将栈顶元素拿出放入寄存器

⑤add 加等

例如:add eax,0ah;=>eax+=0ah;

⑥sub 减等

例如:sub eax,0ah; =>eax=-0ah;

⑦call 调用函数

⑧ret 返回值

寄存器:eax,ebx,ecx,edx

ebp:栈顶指针寄存器(不动)

esp:栈顶指针寄存器

PC:下一行指令寄存器

通过一个小例子来了解函数堆栈调用过程:

#include<stdio.h>
int Sum(int a,int b)
{
	int tmp;
	tmp=a+b;
	return tmp;
}

int main()
{
	int a1=10;
	int b1=20;
	int rt=0;
	rt=Sum(a1,b1);
	printf("%d",rt);
	return 0;
}

实参形参匹配顺序:从左到右

实参形参入栈顺序:从右到左

结论:

1、形参变量开辟内存空间,是在调用方开辟的。

2、返回值赋给eax寄存器,由eax带回main(),赋给rt

3、最后执行ret(pop PC)返回指令,执行一个pop,出栈并赋给下一行寄存器(eax)

当前栈底是main调用sum的call指令的下一条指令地址(mainstartup()调回main())

函数堆栈调用过程

1、形参初始化

2、压入下一行指令地址

3、压入调用方的栈底指针寄存器的值

4、移动edp到被调用方栈底

5、开辟局部变量活动需要的栈空间,并初始化为0x cccccccc

猜你喜欢

转载自blog.csdn.net/VVVv_0427/article/details/84072647