02 无符号数除以非2的幂

无符号数除以非2的幂:

  1. 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

 

步骤:

12^33 / 0AAAAAAABh 的结果向上取整是3

2)还原成代码是argc/3

 

 

 

 

  1. magic number有进位

除法argc/7被转换为乘法:

 

 

 

 

口诀:乘减移加移,magic高位补1

步骤:

(1)观察指令序列,符合乘减移加移模式

(2)24924925h高位补1,得124924925h

(3)代码中肉眼可见移了3位,再加3235,相当于一共移了35

42^35 / 124924925h 向上取整得7,故汇编代码对应的计算是argc/7

 

posted @ 2020-11-17 20:03  八转达人  阅读(107)  评论(0编辑  收藏  举报