版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 第二次研讨会报告对c0s.obj进行修改,使得程序的入口函数不是mian函数,而是hnlg函数。找到main如下将main修改成hnlg编写如下程序:main() h(); printf(%xn,h);用tcc对此程序进行编译、连接,注意会显示什么提示信息?这些信息说明了什么? 提示信息说明了W1.c函数中调用的h函数没有被定义。此程序的运行结果是什么?为什么?注意,要用debug加载,分析汇编指令。 用DEBUG加载如下:因为在调用h()函数时,有一次输出,当调用h()函数后,返回到h()函数的下一条指令时,又有一次输出函数。所以有两次输出。编写如下程序:int n=0;main() fo
2、r(n=11;n15;n+); printf(%dn,n); n=11; while(n15)n+; printf(%dn,n); n=11; do n+; while(n=15时然后再将结果输出。第二个与第一个一样,也是先与15比较,满足条件则加1操作,直到条件不满足将n输出。第三个循环实现的汇编代码如下:这个循环的实现与前面的区别主要是先进行加操作,然后再与15作比较。深入研讨的问题编写如下程序:(通过此程序及相关问题的研究,了解C语言中字符串存储机制。)char str12=hello world;int n=0 x2011;main() for(n=0;strn;n+)printf(%
3、c,strn); 先分析程序的执行结果是什么?然后,再运行程序,验证你的分析是否正确。分析的结果是:输出来的就是字符串hello world循环是何时终止的?循环语句执行了多少次循环?当strn=0时,也就是结尾符的ASKII码时。在我的分析看来循环执行了11次。用debug加载分析: 跳转到0209处的代码如下:取0194处的字符串中的字符到遇到结尾符也就是ASKII码为00时就结束循环。而结尾符ASKII码只占一个字节,它占了全局变量n的高字节,而整个循环过程中n的值12,它不会修改它的高字节的内容,也就是放结尾符的内存单元的值,除非循环 255,结果就不会是我们的理想结果了,而可能要输出
4、比实际多的字符。字符串和全部变量n分别存储在哪儿?各占多少字节大小的空间?字符串的存储空间是放在以0194开始处的一片内存中。而紧跟着字符串后的00的偏移地址为01A0,而根据可知全局变量n就放在字符串的后面。字符串占了11个字节,而全局变量n占了2个字节。将程序中的第一条语句修改为:char str12=hello world!;先分析程序的执行结果是什么?然后,再运行程序,验证你的分析与实际结果是否一直?如果不一致,说明原因。我觉得会输出hello world!验证结果为:为什么多了一个字符乱码的输出?这是怎么回事?debug继续加载如下:最后多出来的一个字符的Askii码是全局变量n的低
5、字节中的值,因为当全局变量n为12时,此时0194+12=01a0,此时取的值刚好为n的低字节的值,所以才会多输出一个。N再加1时,此时便是n的高字节00,遇到0循环结束。编写如下程序:(通过此程序及相关问题的研究,加深对指针变量的理解和认识。)int value_p;int addr_p;char value_pp;int addr_pp;main() char *p; p=(int *)0 x100; *p=0 x111; value_p=(int)p; addr_p=(int)&p; value_pp=*p; addr_pp=(int)(&(*p); printf(%x,%pn,valu
6、e_p,p); printf(%x,%pn,addr_p,&p); printf(%x,%xn,value_pp,*p); printf(%x,%pn,addr_pp,&(*p);用tcc对此程序进行编译,会有警告,怎样消除此警告?从汇编层分析此警告的合理性。将p=(int *)0 x100改为p=(char *)0 x100,便可消除警告出现该警告的原因是将一个指向两个字节(也就是指向整型的地址)赋值给一个指向一个字节的字符的地址,肯定会造成类型不匹配,最后我的猜想是指针p指向了0 x100处的整数的低字节。验证猜想:经验证确实是将0 x111的低字节11放到0 x100所指的一个内存单元中
7、。用文字说明此程序的逻辑功能。首先该程序定义一个指向字符的一个指针,然后再将指向整型的一个指针赋值给p,如图给该整型指针分配了两个内存单元,然后p的值就为0100,因为p是指向字符的指针,所以此时p=0 x100的意思是指向0 x100处的一个字节单元的值。再将该内存单元中赋值0 x111.因为p指向的是一个字节单元。而赋的值为一个字。所以截取该字的低字节11放到p所指的地方去。接下来便是将指针p强制转化成整型然后赋值给全局变量整型value_p中,如上对应的汇编指令可知。此处为全局变量value_p分配的内存单元为【0442】处的一个字单元。接下来又取指针p的地址(也就是系统为指针变量p分配
8、的内存单元的首地址)也就是当前0100所在内存单元的偏移地址然后直接将它赋值给addr_p,系统为addr_p分配的内存单元为【043e】处的一个字单元。然后又取p指针指向的内存单元的内容赋值给value_pp(系统分配的内存单元为0444处的一个字节单元),也就是将0100处的11赋值给value_pp.然后又将指针p所指的内存单元的偏移地址,其实就是p本身的值0100赋值给addr_pp(系统分配的内存单元便是【0440】处的一个字单元)。最后程序运行的结果为:用debug对此程序进行分析,然后,结合此程序说明:指针变量在底层是如何实现的。指针变量在底层是通过存放另外一个变量的偏移地址而实
9、现的。它存放的是其他变量的偏移地址。用debug对此程序进行分析,然后,结合此程序说明:运算符*,&的运算对象和运算结果分别是什么?*是取指针变量中存放的偏移地址所指向的内存单元中的内容。而&是取系统为指针p分配的内存的偏移地址。根据上面的研究结果和第5章的研究经历,完成以下工作:先分析说明运算符的运算对象和运算结果分别是什么,再设计程序验证你的结论。运算符【】的对象必须是指针类型,运算结果是某个内存单元的地址。下面是自己猜想中是不是只能是整型而做的研究:验证的程序如下:main() char a; int b10; for(a=1;a=9;a+) ba=1;通过单步调试,发现a的变化并没有从
10、31变到39,而是从62变到78.,并且,【】运算是将a的值强制转化成整型再加上b的偏移地址。所以虽然此程序中a的值一开始是字符型的。但是系统会将它转化成整形。由此可验证的运算对象本质上是针对整型,运算结果便是相对偏移地址。此程序在看汇编代码时觉得很奇怪,系统为该程序中分配了16个栈单元,在分析时,只用到了【bp-15】与【bp-14】而其余的似乎没用到,为数组分配的内存单元也应该不止是16个,至少也要18个。不知道什么原因,有待探讨。3、思考,研究:变量在底层的实际存储次序与什么因素相关?与变量的定义次序相关?还是变量的使用次序相关?还是可以用以下程序及其的相关变换进行研究,程序如下:char *p;char *pa;char *pf;main() p=(char *)0 x1000; pa=(char *)0 x10
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024届北京市顺义牛栏山一中高三下学期七调考试数学试题
- 鄂教版二年级语文下册教案
- 坦克世界技能培训方案
- DB11T 1075-2014 建筑长城杯工程质量评审标准
- 衬塑钢管技术规格书
- 《电气控制系统设计与装调》教案 项目三任务三:认识交流接触器
- 指甲护剂市场需求与消费特点分析
- 内窥镜技术行业经营分析报告
- 手术用消毒盖布产业深度调研及未来发展现状趋势
- 出牙咬环产业运行及前景预测报告
- 小学作文思维导图-课件(完美版)
- 混凝土监理旁站记录
- 小学经典诵读社团活动计划、安排、记录汇编
- 土木工程结构试验与检测课件
- 倍的认识(刘松)
- C++语言基础知识
- 溃疡性结肠炎的中西结合治疗
- 重大版小学英语四年级上册课件
- 工程施工阶段全过程造价控制与管理工作方案 精品
- DB15T 389-2021内蒙古自治区造林技术规程
- 一年级上册数学课件 《认识11~20各数》(第1课时) 苏教版 (共19张PPT)
评论
0/150
提交评论