【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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值