版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 研究实验一 搭建一个精简的C语言开发平台一、 研究目的1 通过搭建C语言开发平台,认识到汇编语言对于深入理解其他领域知识的重要性。2 对前面所学习的汇编知识进行融合贯通。3 对用研究的方法进行学习进行体验4 培养自己独立研究问题的能力。 二、 研究原理我们要搭建一个精简的C语言开发平台,必须要对C语言开发环境有一个清晰的认识了解。TC2.0软件里有很多子文件和文件夹,而我们的目的是搭建一个精简的C语言开发平台,顾名思义就是要找出我们编译连接程序必须的文件,其他的文件就可以不要。我们可以在程序编译连接中,根据出现的错误,一步一步去把我们程序必须的文件夹找出来。三、 研究步骤和过程1. 安装TC
2、2.0在D盘根目录下,文件名为“TC2.0”。2. 在C盘根目录下建立一个文件夹“minic”用来存放我们已知解决问题要有的程序和文件。在DOC环境下,输入下面的指令:c:md minic3. 把TC.EXE文件拷贝到minc文件夹里,具体操作如下:在DOC中,minic目录下输入如下指令:Copy d:tc2.0tc.exe4. 打开TC2.0输入程序,保存,其文件为“WO.C” 同时设置TC2.0的工作路径,如下图 设置后,保存好。5. 进行编译:编译成功显示: 生成文件WO.OBJ6. 连接: 出现错误,显示连接错误:不能打开C0S.OBJ文件7. 查找C0S.OBJ文件,复制到文件夹m
3、inic 8. 按照步骤6和7的方法,连续找出缺失的必须文件,拷贝到minic文件夹,直到成功生成WO.EXE文件,完成后minic文件夹里有如下图的文件: 四、 遇到的问题与总结1. 在把TC2.0中的内容拷贝到minic文件时,自己指令输错了,后来通过多次试验终于成功了,至此发现自己对DOC的很多指令很不熟悉,今后还的加强在这方面的学习。2. 在找C0S.OBJ时把其中的“0”看成是字母o,导致一直找不到文件,疑惑了不久,后来去查找TC2.0文件夹,才发现其中的是数字0不是字母o.通过这个问题感觉自己还不细心,做程序最重要就是要非常细心,不能出一点擦错。 3. WO.EXE文件生成了,自己
4、去验证了下,发现在程序开始加一个“#include<>”就识别不了了。这个精简的C语言开发平台局限性很大。 4.自己研究了一下,tc里的路径设置,tc保存路径需要生成TCCONFIG.TC文件和TCPICK.TCP文件,这两个文件默认放在C旁的根目录下。 研究实验二 使用寄存器一、 研究目的1 对前面所学习的汇编知识进行融合贯通。2 对用研究的方法进行学习进行体验3 培养自己独立研究问题的能力。 二、 研究步骤和思考1. 编写一个程序yan2.c 编译连接yan2.c,生成了yan2.exe文件,保存在minic中。2. 用Debug加载yan2,exe之后,用u命令查看其机器码和
5、汇编代码。 自己想了下没找到对应的机器码。3. 找main函数在代码段中的偏移地址。 在tc中输入,然后编译连接; 在DOS运行他wo.exe,得到main的偏移地址是1fah 自己在别的程序中也打印了main的偏移地址,发现也是1fah。由此我得出一个结论:main的偏移地址是固定的。对于为什么能打印main的偏移地址,我认为main就相当于一个标号,但这个标号在一定条件下是固定的,不能更改,我试了用别的字母代替main,编译出错。4. 用debug查看1fah处得指令 和C程序一一对应5. 验证:C语言将函数实现为汇编语言中的子程序编写ur2.c,用DEBUG跟踪。 Call 020b相当
6、于调用f(void) 子程序返回,返回值放在了AX中为3。证明了 我们的设想是对的。三、 遇到的问题与总结。1. 第一次编写yan2.c时,我以为寄存器大小写一样可以,就把_AX写成了_ax发现编译错误了,证明了我的假设是错误的。2. 在用U查看yan2.exe的代码时,为什么代码不是从main的偏移地址开始的,而开始的那端代码是有什么作用类?,这里有个疑问,有待研究下面的试验。 研究实验三 使用内存空间四、 研究目的1 深入理解在C语言中如何使用内存空间。2 对用研究的方法进行学习进行体验3 培养自己独立研究问题的能力。 五、 研究过程和思考总结1. 编写程序um1.c,编译连接 用DEBU
7、G察看,2. 用一条C语句实现在屏幕中间显示一个绿色字符a第一次编写了一下程序:可以显示字符a,但颜色是白色,经分析AH肯定没送进内存空间中,后来经过思考才发现,char是字符型的 只占一个字节,后来把程序改为:显示一个绿色a,正确3. 编写程序: 思考问题,通过一步一步在Debug 中察看,发现C语言将全局变量放在内存中,将局部变量放在了栈中,push bp mov bp, sp 含义,为了还原现场。4. 研究函数的返回值存放位置:编程:把变量a,b分别赋值1,2 用debug察看,可以发现:C语言将函数的返回值放在了ax中,在这里返回值为3 。5. 编程: 上面程序是向安全空间写入从0到a
8、的8个字符,第一条指令是 宏定义,buffer后面()中的物理代替buffer, malloc(20)是向系统申请20个安全空间,while是循环指令。六、 体会与收获通过做这个研究实验,我更加深刻地理解了在C语言中如何使用内存空间的。 研究实验四 不用main函数编程七、 研究目的1 对前面所学习的汇编知识进行融合贯通。2 对用研究的方法进行学习进行体验3 培养自己独立研究问题的能力。 八、 研究步骤和思考结果1. 编写一个程序f.c 研究如何进行编译连接:编译可以成功,连接出错。显示错误:这个错误可能与C0S。obj有关系。2. 用link.exe对生成的obj文件进行连接,生成exe文件
9、,用Debug 加载,观察程序汇编代码,思考: f.exe程序代码有1dh个字节;研究发现f.exe不能正常返回;f函数的偏移地址是0000h。3. 编程:m.c 编译连接后用debug 加载开始: 结束: 思考总结:m.exe总代码是0ec8h字节,m.exe可以正常返回,main函数和f函数指令一样,4. 思考与结果: 用Debug对m.exe进行跟踪,找到对main函数进行调用的指令的地址为011a, :整个程序的返回是下面第一个ret: 5. 研究main函数和c0s.obj的关系。研究步骤:1) 用link.exe对c:minic目录下的c0s.obj进行连接,生成c0s.exe2)
10、 用Debug查看cos.exe的汇编代码和m.exe的汇编代码,找到m.exe中的调用main函数的call指令的偏移地址,从这个偏移地址开始向后查看10条指令,然后用debug加载c0s.exe,从相同的偏移地址开始向后察看10条指令。对两处得指令进行比较。m.exe 的汇编代码: C0s.exe的汇编代码:结果分析和问题结果:比较两处指令发现call 后面的地址发生了变化,也就是说调用的子程序的偏移地址不一样。Tc.exe把c0s.obj同用户.obj一起进行连接,生成.exe文件。对main函数调用的指令和程序返回指令是c0s.obj提供的。我们用link.exe可以连接c0s.obj
11、来生成exe文件,然后用debug加载,这样就可以查看c0s.obj文件中的程序代码了。经验证c0s.obj文件里有我们设想的代码。6. 自己编写一个程序c0s.asm,然后编译为c0s.obj,替代c:minic目录下的c0s.obj。如下: 用masm.exe编译之后生成了文件c0s.obj,然后把其拷贝到c:minic目录下,覆盖掉原来的c0s.obj。7. 在c:minic目录下,用tc.exe将f.c重新编译,连接, 生成f.exe。 成功地生成了.exe文件。 然后用debug 查看。 上图中 call 0012指令就是去执行f.exe的代码。8. 在新的c0s.obj的基础上,写
12、一个新的f.c,向安全的内存空间写入从“a”到“h”的8个字符。分析,理解f.c。程序f.c如下: 然后进行编译连接,成功生成了f.exe。 #define是宏定义,意思是把程序中的Buffer全部物理替换为(char *)*(int far *)0x02000000),(char *)*(int far *)0x02000000)表示 地址为0x02000000处的内存中的内容, Buffer = 0; ;将地址为0x02000000的内存中的内容修改为0. Buffe
13、r10 = 0;把0赋值给ds:0+10,字节操作。下面 while是一个循环语句:循环条件是:Buffer10不等于8。 语句主体是:把a到h的8个字符依次放到,0,1,7里。九、 收获与感受做完这个研究试验,我明白了在前几个试验中,如果没有main函数为什么不就不能生成exe文件,是因为TC中的c0s.obj需要和main函数一起连接,现在自己可以不用main函数,也可以编写C程序了,还学会了怎么自己编写c0s.obj文件。 研究实验五 函数如何接受不定数量的参数十、 研究目的1 对前面所学习的汇编知识进行融合贯通。2 对用研究的方法进行学习进行体验3 培养自己独立研究
14、问题的能力。 十一、 研究步骤和思考结果1. 用c:minic下的tc.exe完成下面的试验,写一个程序a.c: 编译连接生成了exe文件,用debug查看,分析a.exe的汇编代码,思考问题:main函数是如何给showchar传递参数的?showchar是如何接受参数的?从上图可以看出:main函数通过栈给shorchar传递参数。然后showchar就从栈里去取参数。2. 写一个程序b.c: 编译连接,用DEBUG察看b.exe的代码,思考问题总结: showchar 函数把n中存的数作为显示字符的个数,当a=8时就结束输出。在程序中showchar的第一个参数的偏移地址是_BP+4,
15、Printf函数是通过计数%c和%d的个数,知道参数个数的。3. 实现一个简单的printf函数,只需要支持“%c,%d”即可。程序如下: void show(char * str,.);main() show("%c + %d= %c",'d',203,'f'); printf("%c + %d= %c",'d',203,'f'); void show(char * str,.) int xianshi=160*20+6; char yu; int jishu=0; char ch; in
16、t i; char *p; int c; int a=0;int b=0; while(*str!=0) if(*str='%') str+; if(*str='c') *(char far *)(0xb8000000+xianshi+a+a)=*(int *)(_BP+6+b+b); a+ ; b+; if(*str='d') c=*(int *)(_BP+6+b+b); if(c=0) *(char far *)(0xb8000000+xianshi+a+a)=0x30; a+; while(c!=0) yu=c%10;c=c/10; *p+=yu;jishu+; for(;jishu>0;jishu-) *(char far *)(0xb8000000+xianshi+a+a)=*(p-1)+0x30; a+;*p-; b
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 青海大学昆仑学院《企业策划》2023-2024学年第一学期期末试卷
- 青海柴达木职业技术学院《机电一体化技术》2023-2024学年第一学期期末试卷
- 青岛职业技术学院《电子设计制造与测试一》2023-2024学年第一学期期末试卷
- 数据驱动的决策制定制作
- 手机银行业务发展及趋势分析
- 大数据技术在各行业的应用与挑战
- 传统车企在智能化转型中的机遇与挑战
- 青岛农业大学海都学院《高级食品化学》2023-2024学年第一学期期末试卷
- 中医药治疗常见慢性病的方法与技巧
- 多元文化背景下的生命教育挑战与机遇
- 电缆行业业务人员入门培训基础知识电缆知识
- 名师工作室主持人交流表态发言稿
- 分布式光伏电站培训课件
- 侵权责任法(第五版)完整版课件
- 毕业设计 锌电解车间的工艺流程和生产方法
- 嘉深台球俱乐部VI手册(VI设计 清晰完整)
- 北林期末考试题年木材学考试题
- 加强眼科医疗服务体系建设
- AECOPD护理查房 课件
- 公司届次职代会暨年工作会宣传方案
- 矿井提升机课件.
评论
0/150
提交评论