您的位置: 首页 >> 新闻中心 >> 计算机 >> IT认证 >> 计算机等级 >> 综合指导
由一个vc内嵌asm的BUG引出的思考
■ 最新课程推荐更多课程>>
学校培训课程开课时间上课地点精英价报名
金 同 方 计算机等级二级C++ 电话预约人大总部¥784
金 同 方 计算机等级二级JAVA 电话预约人大总部¥1470
理工文化 等级考试二级ACCESS电话预约理工大学教学¥676
新 东 方 C语言等级考试远程班滚动开班远程课堂¥98
金 同 方 计算机等级一级辅导班电话预约人大总部¥450
  在语法上, 我们通常认为以下的两条语句是等价的:
mov ecx, offset DATA_LABLE     //其中DATA_LABLE是数据定义标签
lea ecx, DATA_LABLE

而更进一步, 我们也会认为以下两句是等价的:
mov ecx, ebp-8
lea ecx, [ebp-8]

第一种, 用的是存储器寻址方式; 而第二种, 用的是寄存器寻址和寄存器间接寻址方式. 让我意想不到的是, 在第二种情况下, vc的处理并没有让寄存器寻址和寄存器间接寻址方式的mov和lea两者之间实现等价. 在使用 _asm{} 的方式将"mov ecx, ebp-8"这条语句括起来编译之后, 很遗憾地, 我在vc的反汇编窗口发现它变成了这样的一条语句: "mov ecx, ebp". 啊哦, 我的"-8"竟然不翼而飞了! 到目前为止, 我尚没有查到造成这种现象的原因所在, 我只能暂时将它归为vc的bug了.

对gcc下会不会存在这个问题呢? 为更进一步证实, 我使用gcc重新写了这句代码: "mov ecx, ebp-8", 但重写后的代码由当初的一句变成了这样的两句:
movl %ebp, %ecx
subl $8, %ecx

之所以改写成这样的两句, 是因为我发现在AT&T的汇编语法中, 对于双寄存器寻址的操作, 不能对寄存器取的值作任何变换, 也就是说不能写成"movl %ebp-8, %ecx"的形式, 而寄存器间接寻址的操作就可以作变换, 比如:
movl -8(%ebp), %ecx             此句相当于intel asm里的:   mov ecx, [ebp-8]
movl (%ebp, %eax), %ecx         此句相当于intel asm里的:   mov ecx, [ebp+eax]
movl (%ebp, %eax, 4), %ecx      此句相当于intel asm里的:   mov ecx, [ebp+eax*4]
movl -8(%ebp, %eax, 4), %ecx    此句相当于intel asm里的:   mov ecx, [ebp+eax*4-8]

从以上几条语句来看, 似乎AT&T语法对寄存器间接寻址方式的支持没有intel asm更具人性化, 但我猜想AT&T之所以采用这样的方法, 可能一定程度上也是为了提高微指令级的执行效率.

当然, "mov ecx, ebp-8"这句也可以改写成这样的两句:
subl $8, %ebp
movl %ebp, %ecx

但一般不会这么作, 道理是很显然的, ebp通常会作为函数内的基址寄存器, 用于存放函数入口点的堆栈首地址, 这个值的改变会直接影响其后语句对局部变量以及函数参数的引用发生变化, 所以, 在函数首部之后的执行体中, ebp通常是不允许被改变的, 这也是我们设计自己的汇编代码时所应该遵循的原则.

不知道vc为什么会将ebp之后的立即数作丢弃处理, 这显然是没有道德的行为. 这让我想起了这样的一句话: 不要试图帮助用户去纠正错误, 而是当错误发生时去提醒用户, 因为程序再聪明也不会始终明白设计者的真正意图 ,我们所需要作的就是"为异常捕获提供尽可能详细的日志, 并及时通知用户这种异常, 试图纠正异常的作法从方法上就是错误和愚蠢的".

下一篇:上机必读二级上机考试部分评分方法

    自动评分系统有客观、公正的优点,但也有死板的缺点,要想得到比较好的分数,应当考虑到机器的这一特点。实际考试还有人工复查一项,由省级考试部门负责进行.但是人工复查如何进行,我们完全不得而知。因此我们下面的所有内容均不含人工复查内容,仅从考试系统本身来进行分析和说明。
  我们从多次使用中摸索到的考生可能感兴趣的几点介绍如下:
  1. DOS操作题的评分比较复杂,评分系统在几次考试中标准似乎有一些变化。
  按系统的操作说明,只要命令正确...[查看详情]

  影视动画培训   北大BEC培训官方报名网站   2008美国夏令营启航官方指定报名网站   2008留学第一站!  
  北师大 火星时代
共举影视动画培训之鼎
  北大BEC培训官方报名网站
现在报名独享95折!
  2008年国家职业资格考试
一次过关完全备考手册
  2008留学第一站
留学资讯尽在精英留学站!
 
上一篇:全国计算机等级考试三级上机考试应注意哪些问题?
下一篇:上机必读二级上机考试部分评分方法
 相关新闻
·等级考试如何计算通过成绩?·三机(C)上机是只有0分和100分吗?
·计算机等级考试证书的有效期?·全国计算机等级考试考务管理系统升级说明
·计算机等级考试心得:考的就是细心·IT高手的修炼秘笈
·文科生讲述通过计算机等级考试心得·三级网络复习进度日记——兼督促自己按计划完成
·全国计算机三级上机评分标准·计算机等级考试考纲分析辅导
·全国计算机技术信息处理技术员上机考试考生操作须知·对初次参加计算机等级考试者的建议
·计算机等级考试三级的四个类别介绍·多看书--计算机技术资格考试状元的成功秘诀
·计算机等级考试:了解各级别特点·上机必读二级上机考试部分评分方法
 
◇ 重点栏目导航
◇ 精英服务承诺
教育顾问:010-51660910
QQ交流:138660910
相关资料
·二级Access重点难点分析:模块
·2008年4月全国计算机等级考试调整方案
·学习攻略:清华学生谈计算机等级考试
·全国计算机等级考试机试经验三则
·计算机等级考试应如何备考
·计算机等级考试心得:考的就是细心
·计算机等级C语言上机考试改错题分析总结
·计算机等级考试二级VB10个编程技巧
·计算机等级二级C语言程序设计100例九
·计算机等级考试二级VB的复习方法
相关试题
·计算机等级考试二级Access模拟试题1
·计算机二级VisualFoxPro笔试试卷
·计算机等级考试二级C语言模拟练习一[1]
·计算机等级考试上机模拟题(二级C语言)
·Visual FoxPro语言程序设计
·历年计算机等级考试四级
·2005年4月三级网络技术笔试试卷及答案(5)
·07年4月计算机等级考试二级VF考前试题解
·07年4月计算机等级考试二级VF考前密卷
·计算机等级考试PC技术练习题:第六章常用
相关热贴
·全国计算机等级考试——评分标准
·[分享]上机编程题算法实现精选
·2007年下半年北京市全国计算机等级考试报
·C语言初学者的十八颗“地雷”
·CFA LEVEL II介绍
·2008年全国计算机等级调整方案
·C语言运算符的“优先级口决”
·Turbo C 程序设计初步
·程序员如何掌握计算机英语
·和大家分享我自己成功的经验!