汇编语言综合研究试验4--不用main函数编程
试验4内容是比较多的,不过没关系,照着书上要求来,就可以
一.实验过程
1.不用main函数,编写f.c程序并保存在c:\minic下
编译时,没有问题
连接时,报错Linker Error:Undefined symbol ‘_main’in module C0S
错误信息说明,c语言的入口函数main函数是被C0S.obj所调用,错误信息与c0s.obj有关(因为c0s.obj是启动代码)
2.使用link.exe连接f.obj文件,生成f.exe文件,debug查看汇编代码,文件共有541个字节,不能正确返回,从反编译后的指令看到,偏移地址为0开始的程序就是我们编写的程序
3.编写m.c文件,编译,连接,debug查看m.exe的汇编代码
与上一个不能正确返回的程序比较,这个程序中我们编写的程序位于偏移地址为01FA的位置,这个程序有4.17KB字节。但是我们编写的部分两个程序是完全一样的,而且这个程序可以正确返回
4.分别找到call 01fa指令(C0S模块调用了main函数)和整个程序返回的指令
之前连接错误指向了C0S.obj,可以猜想是连接器将C0S和我们的程序编译后的.obj文件连接到一起,也就是调用main函数的指令来自于c0s.obj文件
5.用link.exe对c:\minic下的c0s.obj文件进行连接,生成c0s.exe,debug查看,并比较c0s.exe与m.exe的汇编代码,观察这两个程序的代码,发现两个程序中代码非常相似
之前我们看到,m.exe中调用main函数的call指令的偏移地址为011a,用debug加载c0s.exe,从相同位置开始向后查看10条指令,在m.exe中,call 01fa调用了main函数;在c0s.exe中,相同位置也有一次调用,但是因为没有main函数,连接器找不到main的位置,直接指向了下一条指令
6.从上文分析和探索可以看出,tc.exe将c0s.obj和用户.obj一同连接,生成.exe 。所生成的exe程序运行过程如下:
1>c0s.obj里的程序先运行,进行相关的初始化。如申请资源,设置ds,ss等相关寄存器
2>c0s.obj里的程序调用main函数,从此用户程序开始运行
3>用户程序运行结束从main程序返回到c0s.obj的程序中
4>c0s.obj的程序接着运行,进行相关的资源释放,环境恢复的工作
5>c0s.obj的程序调用DOS的int 21h例程的4ch号中断功能,程序返回
7.用汇编语言编写一个程序c0s.asm,用masm.exe对c0s.asm进行编译,生成c0s.obj,把这个c0s.obj复制到c:\minic目录下,覆盖由tc2.0提供的c0s.obj,再次使用tc.exe对f.c文件进行编译和连接,发现通过了连接,程序可以正确返回
Debug查看f.exe的汇编代码,发现编写的用户程序(f程序)是作为一个子程序出现在程序中的,这个程序被c0s.obj中的指令所调用,调用完成后返回操作系统。这个程序模拟了c0s.obj的主要功能
8.在新的c0s.obj的基础上,写一个新的f.c,向安全的内存空间写入从“a”到“h”的八个字符,这个程序与上一节中程序类似,所不同的是安全空间不是从内存空间中用malloc()来申请,而是直接赋值成为了0,也就是指向内存区域的指针为ds:0。
运行程序到返回之前,查看ds段,已经写入了a-h。
二.总结思考
1.总结:C程序必须从main函数开始,是C语言的规定,这个规定不是在编译时保证的(tc.exe对f.c的编译时可以通过的),也不是连接的时候保证的(虽然,tc.exe文件对f.obj文件不能连接成f.exe,但是,link.exe可以),而是用如下的机制保证的:
首先,C开发系统提供了用户写的应用程序正确运行所必须的初始化和查询返回等相关程序。这些程序存放在相关的.obj文件(如c0s.obj)
其次,需要将这些文件和用户.obj文件一起进行连接,才能生出可正确运行的.exe文件
第三,连接在用户.obj文件前面的由C语言开发系统提供的.obj文件里的程序要对main函数进行调用
基于这种机制,我们只要改写c0s.obj,让它调用其他函数,编程时就可以不写main函数了
2.思考(未解决):使用link.exe连接tc2.0提供的c0s.obj文件时,出现了几个看不懂的东西
三.研究体会
这次的实验,比之前的实验还要繁琐,通过实验,我们进一步认识到c0s.obj文件的作用,以及C语言所规定的程序必须从main函数开始是何种原理,深入了解了tc的编译和连接机制。main函数还是f函数?这不重要。重要的是程序连接的过程中对程序所添加的修改。为了保证程序可以正常的调用和返回,以及其他的一些功能实现,C语言添加了很多辅助代码。
**注意:**完成上面的相关试验之后,把c:\minic目录下的c0s.obj文件恢复为tc2.0提供的c0s.obj文件
综合研究阶段所需要的tc2.0我已经上传网盘,免费分享给大家,关注我的公众号,菜单栏–>技术相关–>免费资源即可领取,还有网课查答案,包括学习通、智慧树、mooc,内容涵盖计算机、政治等等,还有其他免费资源(简历模板、电子版书籍和考试资料等等),说不准大家会有用(分享干货)!
扫码加关注吧!