C/C++ 函数调用本质

初学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)这个函数,然后从呼叫的地方跳转到函数定义的地方
综上所述,函数调用的本质,是地址的跳转,我们知道一个程序有一段属于自己的地址,代码存放在这些地址当中,函数调用的本质是寻址的过程,通过呼叫,跳转,寻找函数定义存放的地址,同时函数的声明也潜在的告诉函数定义的地址在何处

第一次写博客,排版请忽略

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值