有符号费非负2的幂的第一种除法优化

感觉这一种比较简单,就是\(\frac{x}{c} = x * \frac{2^n}{c}*\frac{1}{2^n}\)的除法优化而已,只不过魔术M是负数而已

但是gcc编译的优化方式略有不同

请看下图

当c<0时,\(\frac{x}{c} = -\frac{x}{-c} = - (x*\frac{2^n}{-c}*\frac{1}{2^n})\)

所以上面的0x66666667\(\frac{2^n}{-c}\),且sub ecx,edx不仅仅是做下整转上整,还在做取负

还原的话 先计算出-c的值 \(-c = \frac{2^n}{M}=\frac{2^{33}}{0x66666667} = 4.9999999982537701732058415050132\)向上取整得5,所以\(c=-5\)

参考书籍:c++反汇编与逆向分析技术揭秘

posted @ 2021-12-26 14:50  乘舟凉  阅读(38)  评论(0编辑  收藏  举报