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

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

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

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

请看下图

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

当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++反汇编与逆向分析技术揭秘

上一篇:__stdcall、__cdecl和__fastcall


下一篇:Java CAS 原理分析,聊一聊MySQL数据库中的那些锁