王朝网络
分享
 
 
 

由一个vc内嵌asm的BUG引出的...

王朝vc·作者佚名  2006-05-24
宽屏版  字体: |||超大  

在语法上, 我们通常认为以下的两条语句是等价的:

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有