首页
社区
课程
招聘
未解决 [求助]倒数相乘的编译器优化
发表于: 2020-8-15 23:13 1711

未解决 [求助]倒数相乘的编译器优化

2020-8-15 23:13
1711

#include<stdio.h>
int main(){
int a;
scanf("%d",&a);
printf("%d",a/11);
return 0;
}

 

mov eax,2E8BA2E9
imul ecx ecx是a
sar edx,1
mov ecx,edx
shr ecx,1F 拿到符号位
add edx,ecx 如果是负数,结果加1

 

为什么最后如果是负数的话结果加1呢?
这是加密与解密4的p127上的例子,最后加1这里不太理解


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 1
支持
分享
最新回复 (2)
雪    币: 344
活跃值: (314)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不知道 对不对 首先有符号数除法是向下取整的,比如5/2 为 2 ,假如负数的话,向下取整 -5/2 为-3,其实我们应该想要的是-2 所以加了1
2020-8-16 17:52
0
雪    币: 962
活跃值: (9976)
能力值: ( LV13,RANK:385 )
在线值:
发帖
回帖
粉丝
3
如果只是还原 直接 2^33 / 780903145 (2E8BA2E9) 向上取整. 如果追究原理看下<<C++ 反汇编与逆向分析技术揭秘.>>  最后的add edx,ecx 其实是调整符号位.
上面通过计算之后,如果结果是负数 那么 add edx,ecx  ecx = 1  edx = 负数 相当于是 负数+1    如果不是负数的话.那么ecx = 0. edx = 0  add edx,ecx  就等于什么也没做. 算是一个调整吧. 具体看下上面推荐的那本书吧.
2020-8-16 19:38
0
游客
登录 | 注册 方可回帖
返回
//