欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    软件开发环境CH22.ppt

    • 资源ID:6105743       资源大小:126.05KB        全文页数:18页
    • 资源格式: PPT        下载积分:10金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要10金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    软件开发环境CH22.ppt

    软件开发环境,理解指针和强制转换,我们最迷惑和没有信心的是c语言的指针和强制转换,何时能转换,怎样的转换是安全的?运用我们之前的学习成果吧。用反汇编分析。,请判断这段代码的执行结果,short i;short j;int*pi;void main(int argc,char*argv)cout j endl;pi=(int*),void main(int argc,char*argv)int i;int*pi;short*ps;char*pc;pi=*pc=0 x12,我们想分析如上代码的反汇编,这时,跑了个ebp-14h出来,不理解!这时在猜测、实证的道路上就要考验我们回避问题,迂回解决的处理能力了。如何修改一下,让我们容易理解呢,pi=0041139A lea eax,ebp-8 0041139D mov dword ptr ebp-2Ch,eax,int i;int*pi;short*ps;char*pc;void main(int argc,char*argv)pi=*pc=0 x12,用全局变量,就可以看到我们之前熟悉的形式,pi=004113B7 mov eax,1234h 004113BC mov ecx,dword ptr ps(417144h)004113C2 mov word ptr ecx,ax,现在大家对mov dword ptr pi(417148h),offset i(41714Ch)中的offset不理解,那么我们去掉符号显示得到如下结果,pi=004113B7 mov eax,1234h 004113BC mov ecx,dword ptr ds:00417144h 004113C2 mov word ptr ecx,ax,pi=004113A2 mov dword ptr ds:00417140h,41714Ch 注意以上三句话,显示了2中强制转换指针的情况,第一种没有强制转换。但三句话中除了被赋值的地址不同,其余一摸样。并没和类型转换相关的指令,就是将41714c这个地址值赋值给了三个不同的地址。我们惊讶地发现,其实没有所谓的“类型强制指令或相关信息”,那强制转换怎么就复杂而不安全了?我们需要实证如下信息,请用调试器证明1.41714ch是i的地址;2.Mov指令中方括号中那三个地址分别是pi,ps,pc的地址,其实也好理解,对指针的强制转换,不过是将地址这个整数赋值给一个指针变量,地址是32位整数,指针变量时32位整数,怎么也不会有任何问题的。指针是拿来读取该地址或写该地址的,那么危险是否发生在这个地方?还有,既然是类型强制转换,这个类型信息又在哪里呢?请看那三个赋值语句的反汇编,*pi=0 x1234;004113AC mov eax,dword ptr ds:00417148h 004113B1 mov dword ptr eax,1234h*ps=0 x1234;004113B7 mov eax,1234h 004113BC mov ecx,dword ptr ds:00417144h 004113C2 mov word ptr ecx,ax*pc=0 x12;004113C5 mov eax,dword ptr ds:00417140h 004113CA mov byte ptr eax,12h,1.00417148h是pi的地址,第一条mov指令让eax寄存器的值为pi变量存放的值,也就是i的地址2.第2条mov指令将1234h赋值给eax指向的地址,也就是i的地址,完成对i的赋值请大家用单步跟踪证实以上分析,同理分析,*ps=0 x1234;对应的汇编语句,也有前面类似的逻辑。同样将0 x1234赋值给了i变量。*pi=0 x1234004113B1 mov dword ptr eax,1234h*ps=0 x1234;004113B7 mov eax,1234h 004113BC mov ecx,dword ptr ds:00417144h 004113C2 mov word ptr ecx,ax 既然都是对同一个地址赋值(i的地址),关键性差异在哪里?这里最关键的差异是mov赋值时,一个是dword,一个是word。代表一个是赋值4字节,一个赋值2字节的长度。这时我们发现了强制转换后,关键性的不同,是在读写地址指向的内存时,读写长度的不同!这也是不同类型整数的关键差异。请大家实验一下,用调试器证明赋值长度的不同。,所以,指针强制转换的差异发生在用该指针去读写其指向的地址的内容。不同类型,生成的读写指令不同,读写的长度不同。对于上例,i是整数,长4字节,强制为short指针,读写的是2字节。所以还是在i变量的范围内。如果将i的类型换成short i;pi=(int*)i;*pi=0 x1234;这样的代码有问题吗?请分析,并用调试器证明,强制转换是否安全,关键看转换前的变量的大小能否放下转换后类型的数据。如果放不下,就是越界,就是错误其实指针是c语言有别于汇编中地址这个概念的东西。虽然说c的指针首先肯定是一个地址,但不仅仅代表地址。在存取内存时,它代表了读写的长度,长度为该指针指向的类型的大小。(注意,c中指针的加减n运算不是加减一个n字节,而是加减n*类型大小,个字节),请判断这段代码的执行结果,int*pi;short si=12;pi=(int*),1179660 12000c.结果不是12和0C,为什么?指针类型表示的是指针要访问的数据的大小,int*指向4字节的数据,short*指向2字节的数据pi=(int*)/使pi指向一个等于&si的地址*pi访问通过pi指向的数据,注意,pi指向4字节的数据而不是2字节再请大家思考,这个显示结果12000c中那部分是必然的,注意:在 intel86中,整数的低字节放在内存的低地址,si=0 x0c.因为 si 是 短整型,它包括两字节,如图用红色标志的pi 也指向&si.但是它包括了4个字节的地址,0c 00 12 00.因此,*pi 不是 12,而是 0 x12000c.,数据指针反思,任何一个东西是从使用来界定其内涵的,数据指针是读写内存用的。因此包含两部分信息指针首先是地址其次提示编译器访问该地址时,生成的访问代码(读/写)到底访问多少个字节 作为指针强制转换,并不影响地址的值,因此,必然受到2部分影响。所以转换前后数据的大小将影响转换的安全性,否则会越界,

    注意事项

    本文(软件开发环境CH22.ppt)为本站会员(sccc)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开