首页
社区
课程
招聘
[求助]vc6.0 优化编译后反汇编的问题
发表于: 2013-1-29 08:05 6858

[求助]vc6.0 优化编译后反汇编的问题

2013-1-29 08:05
6858
下面的代码是我在vc6.0下(release版)的返回汇编代码

int nVarOne = 1;
printf("nVarOne / 2 = %d \n", nVarOne / 2);

.text:00401015 mov     eax, esi
.text:00401017 cdq
.text:00401018 sub     eax, edx //自身减去扩展高位,什么意思??
.text:0040101A sar     eax, 1
.text:0040101C push    eax
.text:0040101D push    offset aNvarone2D_1 ; "nVarOne / 2 = %d \n"
.text:00401022 call    sub_4019F2



问题:sub     eax, edx 这句不是多余的吗?因为调试时,edx是0,减去0不是等于没减吗?
请哪位大哥解释一下

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 324
活跃值: (1104)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
这主要是考虑有符号数而做的处理。试想一下,如果原值是-1,不做那个修正的后果是什么?
2013-1-29 08:31
0
雪    币: 327
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
嗯  对的  就是符号位清零处理   前提是只用低位进行有效计算
2013-1-29 08:53
0
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
一般在VC代码中看到cdq,上下文应该就是除法
2013-1-29 10:46
0
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
.text:00401015 mov eax, esi
.text:00401017 cdq
.text:00401018 sub eax, edx //自身减去扩展高位,什么意思??
.text:0040101A sar eax, 1

对esi的值进行带符号地除以2, 如果直接sar eax,1,结果-1/2仍是-1, 加上前面的逻辑,结果就是-1/2=0。
2013-2-4 18:27
0
雪    币: 2676
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
一个有符号数除以2的n次方,如果采用右移位操作完成,非负数结果自然正确,负数需要额为+1,结果才正确。
当被除数为非负数时,edx为0,减去0相当于什么都没做。当被除数为负数时,edx为-1,减去-1就意味着+1,正好修正了结果。
2013-2-4 21:51
0
雪    币: 724
活跃值: (81)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
先去了解下sar是什么操作吧。
2013-2-5 08:35
0
雪    币: 40
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
这是c语言为了向零取整。不做这一步,在负数的时候是向负无穷取整
2013-9-23 23:58
0
游客
登录 | 注册 方可回帖
返回
//