Code-Verständnis Problem



  • Hallo zusammen,

    kann mir mal jemand unten stehenden Code erklären? Irgendwie kann ich nicht ganz verstehen was dort gemacht wird.

    Warum wird beispielsweiße in die Variablen TimerLow / TimerHigh der Wert vom eax/edx - Register geschrieben und was hat das mit einem Timer zu tun?

    Schon mal danke vorab, für jeden der hilft.

    function GetCPUSpeed(): double;
    const
    	TimeOfDelay = 500;
    var
    	TimerHigh, TimerLow: DWORD;
    begin
    	SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
    	SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
    	Sleep(10);
    asm
      dw 310Fh
      mov TimerLow, eax
      mov TimerHigh, edx
    end;
      Sleep(TimeOfDelay);
    asm
      dw 310Fh
      sub eax, TimerLow
      sbb edx, TimerHigh
      mov TimerLow, eax
      //mov TimerHigh, edx
    end;
      Result := TimerLow / (1000.0 * TimeOfDelay);
    end;
    


  • Die Zeile

    dw 310Fh
    

    ist ein Operationscode für den Befehl RDTSC (Read time stamp counter). Dieser time stamp counter ist ein 64 Bit Zähler und sein 64 Bit Inhalt landet nach des Ausführung des Befehls in den Registern EAX und EDX. Ausführliche Beschreibung dazu schau bitte in den Intel Manuals... Jemand versucht mit diesem Code, ungefähr die Anzahl der CPU Takte für den Aufruf der Funktion Sleep(TimeOfDelay); zu bestimmen.

    Ein Beispiel für RDTSC siehe z.B. hier http://www.c-plusplus.net/forum/viewtopic-var-t-is-237896.html 🤡


Anmelden zum Antworten