02 无符号数除以非2的幂
无符号数除以非2的幂:
- magic number无进位
int main(unsigned int argc, char *argv[]) {
printf("%d", argc / 3);//注意被除数是unsigned
return 0;
}
.text:00401043 mov eax, 0AAAAAAABh
.text:00401048 mul [ebp+argc]
.text:0040104B shr edx, 1
A/C = A*(1/C) = A*(2^n / C)*(1 / 2^n),令M=2^n / C,则
A/C = AM>>n
步骤:
(1)2^33 / 0AAAAAAABh 的结果向上取整是3
(2)还原成代码是argc/3
- magic number有进位
除法argc/7被转换为乘法:
口诀:乘减移加移,magic高位补1
步骤:
(1)观察指令序列,符合乘减移加移模式
(2)24924925h高位补1,得124924925h
(3)代码中肉眼可见移了3位,再加32得35,相当于一共移了35位
(4)2^35 / 124924925h 向上取整得7,故汇编代码对应的计算是argc/7