江佳_第二次研讨会报告v20(共9页)_第1页
江佳_第二次研讨会报告v20(共9页)_第2页
江佳_第二次研讨会报告v20(共9页)_第3页
江佳_第二次研讨会报告v20(共9页)_第4页
江佳_第二次研讨会报告v20(共9页)_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 第二次研讨会报告(bogo)对c0s.obj进行修改,使得程序的入口函数(hnsh)不是mian函数,而是hnlg函数。找到main如下(rxi)将main修改成hnlg编写如下程序:main() h(); printf(%xn,h);用tcc对此程序进行编译、连接,注意会显示什么提示信息?这些信息说明了什么? 提示信息说明了W1.c函数中调用的h函数没有被定义。此程序的运行结果是什么?为什么?注意,要用debug加载,分析汇编指令。 用DEBUG加载如下:因为在调用h()函数时,有一次输出(shch),当调用h()函数后,返回到h()函数的下一条指令时,又有一次输出函数。所以有两次输出。编

2、写(binxi)如下程序:int n=0;main() for(n=11;n15;n+); printf(%dn,n); n=11; while(n15)n+; printf(%dn,n); n=11; do n+; while(n=15时然后(rnhu)再将结果输出。第二个与第一个一样(yyng),也是先与15比较,满足条件则加1操作,直到条件不满足将n输出。第三个循环(xnhun)实现的汇编代码如下:这个循环的实现与前面的区别主要是先进行加操作,然后再与15作比较。深入研讨的问题编写如下程序:(通过此程序及相关问题的研究,了解C语言中字符串存储机制。)char str12=hello wo

3、rld;int n=0 x2011;main() for(n=0;strn;n+)printf(%c,strn); 先分析程序的执行(zhxng)结果是什么?然后,再运行程序,验证你的分析是否正确。分析(fnx)的结果是:输出(shch)来的就是字符串hello world循环是何时终止的?循环语句执行了多少次循环?当strn=0时,也就是结尾符的ASKII码时。在我的分析看来循环执行了11次。用debug加载分析: 跳转到0209处的代码如下:取0194处的字符串中的字符到遇到结尾符也就是ASKII码为00时就结束循环。而结尾符ASKII码只占一个字节,它占了全局变量n的高字节,而整个循环过

4、程中n的值12,它不会修改它的高字节的内容,也就是放结尾符的内存单元的值,除非循环 255,结果就不会是我们的理想结果了,而可能要输出比实际多的字符。字符串和全部变量n分别存储在哪儿?各占多少字节大小的空间?字符串的存储空间是放在以0194开始处的一片内存中。而紧跟着字符串后的00的偏移地址为01A0,而根据可知(k zh)全局变量n就放在字符串的后面。字符串占了11个字节(z ji),而全局变量n占了2个字节。将程序中的第一条语句(yj)修改为:char str12=hello world!;先分析程序的执行结果是什么?然后,再运行程序,验证你的分析与实际结果是否一直?如果不一致,说明原因。

5、我觉得会输出hello world!验证结果为:为什么多了一个字符乱码的输出?这是怎么回事?debug继续加载如下:最后多出来的一个字符的Askii码是全局变量n的低字节中的值,因为当全局变量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; v

6、alue_p=(int)p; addr_p=(int)&p; value_pp=*p; addr_pp=(int)(&(*p); printf(%x,%pn,value_p,p); printf(%x,%pn,addr_p,&p); printf(%x,%xn,value_pp,*p); printf(%x,%pn,addr_pp,&(*p);用tcc对此程序进行编译,会有警告,怎样消除此警告?从汇编(hubin)层分析此警告的合理性。将p=(int *)0 x100改为(i wi)p=(char *)0 x100,便可消除警告出现该警告的原因是将一个指向两个字节(也就是指向整型的地址)赋值给

7、一个指向一个字节的字符的地址,肯定会造成类型不匹配,最后(zuhu)我的猜想是指针p指向了0 x100处的整数的低字节。验证猜想:经验证确实是将0 x111的低字节11放到0 x100所指的一个内存单元中。用文字说明此程序的逻辑功能。首先该程序定义一个指向(zh xin)字符的一个指针,然后(rnhu)再将指向整型的一个指针赋值给p,如图给该整型指针分配(fnpi)了两个内存单元,然后p的值就为0100,因为p是指向字符的指针,所以此时p=0 x100的意思是指向0 x100处的一个字节单元的值。再将该内存单元中赋值0 x111.因为p指向的是一个字节单元。而赋的值为一个字。所以截取该字的低字

8、节11放到p所指的地方去。接下来便是将指针p强制转化成整型然后赋值给全局变量整型value_p中,如上对应的汇编指令可知。此处为全局变量value_p分配的内存单元为【0442】处的一个字单元。接下来又取指针p的地址(也就是系统为指针变量p分配的内存单元的首地址)也就是当前0100所在内存单元的偏移地址然后直接将它赋值给addr_p,系统为addr_p分配的内存单元为【043e】处的一个字单元。然后又取p指针指向的内存单元的内容赋值给value_pp(系统分配的内存单元为0444处的一个字节单元),也就是将0100处的11赋值给value_pp.然后又将指针p所指的内存单元的偏移地址,其实就是

9、p本身的值0100赋值给addr_pp(系统分配的内存单元便是【0440】处的一个字单元)。最后程序运行的结果为:用debug对此程序进行分析,然后,结合此程序说明:指针变量在底层是如何实现的。指针变量在底层是通过存放另外一个变量的偏移地址而实现的。它存放的是其他变量的偏移地址。用debug对此程序(chngx)进行分析,然后,结合此程序说明:运算符*,&的运算对象和运算结果分别是什么?*是取指针变量中存放(cnfng)的偏移地址所指向的内存单元中的内容。而&是取系统为指针p分配的内存的偏移地址。根据上面的研究结果和第5章的研究经历,完成(wn chng)以下工作:先分析说明运算符的运算对象和

10、运算结果分别是什么,再设计程序验证你的结论。运算符【】的对象必须是指针类型,运算结果是某个内存单元的地址。下面是自己猜想中是不是只能是整型而做的研究:验证的程序如下:main() char a; int b10; for(a=1;a=9;a+) ba=1;通过单步调试,发现a的变化并没有从31变到39,而是从62变到78.,并且(bngqi),【】运算是将a的值强制转化成整型再加上b的偏移地址。所以虽然此程序中a的值一开始是字符型的。但是系统会将它转化成整形。由此可验证的运算对象本质上是针对整型,运算结果便是相对偏移地址。此程序在看汇编代码时觉得很奇怪,系统为该程序中分配(fnpi)了16个栈

11、单元,在分析时,只用到了【bp-15】与【bp-14】而其余(qy)的似乎没用到,为数组分配的内存单元也应该不止是16个,至少也要18个。不知道什么原因,有待探讨。3、思考,研究:变量在底层的实际存储次序与什么因素相关?与变量的定义次序相关?还是变量的使用次序相关?还是可以用以下程序及其的相关变换进行研究,程序如下:char *p;char *pa;char *pf;main() p=(char *)0 x1000; pa=(char *)0 x1001; pf=(char *)0 x1002;改变(gibin)顺序:由此可见是与变量(binling)的初始化有关与定义的先后顺序也无关,与使用也无关,因为此程序都没有用到三个变量。至于是分配哪个内存(ni cn)单元给谁,是根据操作系统的一些机制和和一些编译原理而确定的。问题研究心得 进一步深入对指针在计算中的实现有了更深刻的了解,前面的知识得到了进一步的巩固。内容总结(1)第二

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论