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