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 😉


Anmelden zum Antworten