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

Posted Redamanc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从汇编指令角度理解函数调用过程相关的知识,希望对你有一定的参考价值。

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

示例代码

我们首先来看如下代码:

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

以上是关于从汇编指令角度理解函数调用过程的主要内容,如果未能解决你的问题,请参考以下文章

从汇编层面看函数调用的实现原理

深入理解C语言从函数栈帧角度理解return关键字

函数栈帧的创建和销毁

函数栈帧的创建和销毁

从汇编角度分析C语言的过程调用

c语言中函数调用的本质从汇编角度分析