从汇编指令角度理解函数调用过程

从指令角度理解函数调用过程

示例代码

我们首先来看如下代码:

int sum(int a, int b)
{
	int temp = 0;
	temp = a + b;
	return temp;
}

int main()
{
	int a = 10;
	int b = 20;

	int ret = sum(a, b);

	return 0;
}

生成指令

int sum(int a, int b)
// push ebp
// mov ebp,esp
// sub esp, 4Ch
// rep stos
{
	// mov dword ptr[ebp-4], 0
	int temp = 0;
	// mov eax, dword ptr[ebp+0Ch]
	// add eax, dword ptr[ebp+8]
	// mov dword ptr[ebp-4], eax
	temp = a + b;
	// mov eax, dword ptr[ebp-4]
	return temp;
// mov esp, ebp
// pop ebp
// ret
}

int main()
{
	// mov dword ptr[ebp-4], 0Ah
	int a = 10;
	// mov dword ptr[ebp-8], 14h
	int b = 20;

	// mov eax, dword ptr[ebp-8]
	// push eax
	// mov eax, dword ptr[ebp-4]
	// push eax
	// call sum
	// add esp, 8
	// mov dword ptr[ebp-0ch], eax
	int ret = sum(a, b);

	return 0;
}

注意:
本文旨在通过简单的汇编指令来分析函数调用的过程,并不细究汇编指令。

具体过程

首先,程序从main函数开始运行,给主函数分配栈帧:其中的ebp指向main函数栈帧的栈底esp指向main函数栈帧的栈顶
在这里插入图片描述
接着运行int a = 10;
在这里插入图片描述
接下来是int b = 20;:
在这里插入图片描述
接下来是int ret = sum(a,b):
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
接下来是sum函数
首先是给sum函数开辟栈帧:(即“{”之前的指令)
在这里插入图片描述
接着执行:int temp = 0;:
在这里插入图片描述
接着运行temp = a + b;:
在这里插入图片描述
接着运行return temp;:
在这里插入图片描述
接着是函数的右括号“}”
在这里插入图片描述
接着调用函数完毕,回到主函数:
利用了PC寄存器,使得程序知道退出sum后运行哪一条指令:
在这里插入图片描述
最后return 0,程序结束。

参考资料

【1】施磊. 从指令角度掌握函数调用堆栈详细过程. 腾讯课堂. 2019.06

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值