Modulo und der Compiler
-
Hallo,
ich disassemble gerade meinen eigenen Code.Nun benutze ich zum Erstellen einer Zufallszahl Modulo(%)
Allerdings verstehe ich nicht genau wie der Compiler das ausrechnet (ohne Division ?)Das ist mein C-Code welcher eine Zufallszahl zwischen 0 und 100 ausrechnet:
int r_zahl, u_zahl; srand ( time(NULL) ); r_zahl = rand() % 101;
und das ist der Assembler-Code:
mov [esp+28h+var_28], 0 call time ; time(NULL) mov [esp+28h+var_28], eax call srand ; srand(time(NULL)) call rand ; rand() mov ecx, 288DF0CBh ; Was hat diese Zahl zu bedeuten mov esi, eax imul ecx ; Warum eine Multiplikation, und keine Division mov [ebp+var_14], edx mov ebx, [ebp+var_14] mov [ebp+var_18], eax mov eax, esi cdq sar ebx, 4 ; Hat das noch was mit der Modulo-Berechnung zu tun ? sub ebx, edx lea edx, [ebx+ebx*4] lea edx, [edx+edx*4] lea edx, [ebx+edx*4] mov ebx, esi sub ebx, edx lea esi, [ebp+var_C]
Und meine Frage ist, was hat der Compiler gemacht um die unperformante Division zu sparen ?
Vielen Dank für all eure Antworten
Gruss Rechner
-
er multipliziert einfach mit der inversen.
fffffffffh/101=288DF0CBh
er koennte auch mit 2999df0ch multiplizieren, dann wuerde er sich den shift nach rechst um 4 bit sparen.
-
ändert sich das compilat eigentlich, wenn du
int r_zahl, u_zahl; srand ( time(NULL) ); r_zahl = unsigned(rand()) % unsigned(101);
machst?
-
ich denke das sar wird dann zu nem shr, mehr mueste eigentlich nicht.
-
Vielen Dank