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