【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