感觉这一种比较简单,就是\(\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++反汇编与逆向分析技术揭秘