为什么C程序里一定要写main函数

为什么C程序里一定要写main函数

一、 学习过程

编写程序f.c

对其进行编译,正常通过,再对其进行连接,出现错误:

为什么C程序里一定要写main函数

显示的出错信息为:

翻译成中文是:在c0s模块没有定义符号’_main’。

那么这个错误信息可能与文件c0s.obj有关。那么是什么原因导致编译出错呢?

既然已经将程序编译成了obj文件,那么用之前我们经常使用的link.exe能否将它连接呢?结果是可以的:

为什么C程序里一定要写main函数

debug查看f.exe

为什么C程序里一定要写main函数

程序是从06fb006fb001c,一共29个字节。但是整个程序的代码有541字节:

为什么C程序里一定要写main函数

执行最后一条ret指令,返回到b800处:

为什么C程序里一定要写main函数

查看该地址的上一条指令:

发现上一条指令是push ds,不是跳转指令,所f.exe没有正确返回.

由上图知f函数的偏移地址是0.

编写程序m.c:

m.c进行编译连接,这一次连接没有出现错误。

debug查看m.exe,发现代码还是在1fa处:

为什么C程序里一定要写main函数

程序是从06fb01fa06fb0216,一共29个字节。但是整个程序的代码有4.19KB

为什么C程序里一定要写main函数

程序返回06fb:011d,查看该地址之前的代码:

为什么C程序里一定要写main函数

发现上一条指令是call 01fa,即跳转到主程序所在代码段,所以程序的返回是正确的。

观察两个程序的汇编代码发现:

1f.exe的偏移地址为0,在debug中直接用u命令就可看到,而m.exe的偏移地址为1fa,在debug中用u命令查看到的不是main函数中的代码。

2f.exe有没有被调用,所以函数返回是错误的,m.exe被调用了,所以函数的返回是正确的。

由上图知:对main函数进行调用的指令地址为06fb:011a,整个m.exe程序返回的指令是:

我们发现,对main函数进行调用的指令和程序返回的指令都不是我们所写的语句,而是编译或连接过程中提供的。

没有main函数时,Tc里出现连接错误,提示c0s.obj里的main是没有定义的,而没有c0s.exe就无法对程序进行连接,那么有可能tc是把c0s.obj或者它的一部分与m.exe

一起进行连接生成exe文件。而且对main函数进行调用的指令和程序返回的指令应该就是c0s.obj所提供的。那么我们要对c0s.obj进行研究,可以用link.exe对它进行连接,再用debug查看汇编代码。发现虽然link提示错误,但是还是生成了c0s.exe文件:

为什么C程序里一定要写main函数

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/f6590bdd91162665cb9473c3620a2ad9.html