逆向工程之表达式优化识别(4)-除法(下)
2016-07-05 11:02
260 查看
除法优化
继续说除法,之前说了除数为正数的除法,现在再来说除数为负的除法,其实基本思路都已经差不多了,区别在于关于取整时候的定理。这里在理解的时候其实和之前类似,讨论a的大小即可,我这里只列出了向上取整的转换,因为默认是向下取整的,我们不需要向下取整的转换。向上取整也只需要讨论a<0的情况,因为只有这样才需要转换,所以只需要举例做简单思考,基本上和上一节除法的思考过程一样。
1 除数为负2的幂
说明:和除数为正2的幂情况一样,区别在于需要加一个符号而已。示例:
mov eax, VAL cdq and edx, 7 add eax, edx sar eax, 3 neg eax
neg之前的代码和前一节除数为正2的幂的时候一样,最后取负即可,比较简单。
2 除数为负的非2的幂
说明:在有了这样的前提下,其余过程基本类似,主要是注意区分识别,因为这里的n也会相应较大,区分和除数大于0时候的n较大情况。
示例:
mov ecx, VAL mov eax, 99999999h imul ecx sar edx, 1 mov eax, edx shr eax, 1Fh add edx, eax
这里是x/(-5)的代码,在识别了负数调整之后,剩下的代码也就只有前4句,将前四句对应表达式写下来并化简,可得到edx = (ecx * m)/2^33。再由理论得到的公式,即可算出来y约等于5。(主要是区分取n大于32时的除数为正数的除法,区别在于imul之后没有add语句,相当于虽然n大于32,但是这里的形式同上一届示例1,n大于32说明了是负数)
示例2:
mov ecx, VAL mov eax, 6DB6DB6Dh imul ecx sub edx, ecx sar edx, 2 mov eax, edx shr eax, 1Fh add edx, eax
这里是x/(-7)的代码,基本上也和上一节的n大于32情况处理是一样的,对称思考,这里的n是小于32的,对应上一节n大于32,其实也就是一个对整体取符号的过程。最后推导也是一样的,写出表达式,可得到
x/y = ecx * (ecx - 2^32)/2^34
这样就和我们得到的表达式形式一致了,将新的magic number代入即可得到除法原型了。
相关文章推荐
- MySQL 优化
- Google排名优化的几个影响因素
- DB2优化(简易版)
- Mysql limit 优化,百万至千万级快速分页 复合索引的引用并应用于轻量级框架
- 用批处理解决数学问题的代码第1/4页
- C#中尾递归的使用、优化及编译器优化
- 对优化Ruby on Rails性能的一些办法的探究
- 优化Ruby脚本效率实例分享
- Asp编码优化技巧
- 如何监测和优化OLAP数据库
- mysql -参数thread_cache_size优化方法 小结
- 深入学习SQL Server聚合函数算法优化技巧
- MySQL常见的底层优化操作教程及相关建议
- 详解mysql的limit经典用法及优化实例
- 数据库学习建议之提高数据库速度的十条建议
- oracle数据库sql的优化总结
- SQL语句性能优化(续)
- SQL语句优化提高数据库性能
- SQL优化经验总结
- SQL优化技巧指南