初学C语言的小白可能在接触函数的时候知其所以然,不知其所以然,只知道函数需要声明,定义,函数需要参数,返回值、函数名,至于内在的调用过程却不知道。
在讲解函数调用本质的过程之前,这里先展示一段代码:
#include <stdio.h>
void f()
{
printf("Hello World!\n");
}
int main()
{
f();
return 0;
}
可以看到上面是一段最熟悉不过的代码,主函数只是调用函数 f(),然后函数 f() 调用标准输出函数打印 “Hello World”
接下来将使用VS2019对这段程序进行调试,运行
可以看到这是预料之内的结果,接下来打开反汇编:
可以清楚的看到在程序调用函数之前有一段汇编代码:
009F183E call _f (09F11CCh)
这一段汇编代码的含义可以看作程序将跳转到地址为0x09F11CCh的地方,然后我们继续调试
可以看到程序执行到 0x009F11CC,这里有一段jmp指令,将程序跳转到0x09F17D0h处,继续调试:
可以看到我们的程序跳转到了函数f()处,也就是说程序在调用一个程序时,先呼叫(call)这个函数,然后从呼叫的地方跳转到函数定义的地方
综上所述,函数调用的本质,是地址的跳转,我们知道一个程序有一段属于自己的地址,代码存放在这些地址当中,函数调用的本质是寻址的过程,通过呼叫,跳转,寻找函数定义存放的地址,同时函数的声明也潜在的告诉函数定义的地址在何处
第一次写博客,排版请忽略