[gelöst]Fehler mit GCC inline Assembler
-
Hallihallo,
ich wollte eine Funktion mit inline Assembler vom MS-Compiler nach GCC übertragen, aber komme bei einer Fehlermeldung nicht weiter.
Wer kann mir da helfen?Funktion die mit dem MS-Compiler funktioniert:
unsigned long long get_cpu_ticks() { __asm { XOR eax, eax CPUID RDTSC }; }
Funktion mit GCC die mit der Fehlermeldung: impossible register constraint in 'asm' beim kompilieren abbricht. Ich habe mir die Handbücher zum InlineAsm angeschaut aber komme irgendwie nicht auf die Lösung
unsigned long long get_cpu_ticks() { unsigned long long res; asm ( "XOR %eax, %eax;" "CPUID;" "RDTSC;" : "=a" (res) ); return res; }
G hibbes
-
Intel oder AT&T Syntax?
-
Ich denke AT&T Syntax, da dies die Standardeinstellung ist und der Code auch kompiliert wird wenn die Ausgabe : "a=" (res) fehlt.
-
Wenn es nur darum geht den Timestamp Counter auszulesen dann sollte folgendes als Beispiel dienen:
#include <stdio.h> typedef unsigned long long ull; typedef unsigned int ui; static ull get_ticks(void) { ui eax, edx; asm volatile ( "rdtsc" : "=a"(eax), "=d"(edx) ); return ((ull)eax) | (((ull)edx) << 32); } int main(int argc, char** argv) { printf("rdtsc: %llu", get_ticks()); return 0; }
Infos zu rdtsc: http://faydoc.tripod.com/cpu/rdtsc.htm
Ich denke Problem bei Deinem Beispiel ist das Du zwar einen output register angegeben hast ("=r") ihn aber nicht verwendest ("%0"). Da rdtsc aber das Ergebnis direkt in eax und edx schreibt kann man das Ergebnis aus den beiden Registern auslesen, daher "=a" für eax und "=d" für edx (http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#ss6.1).
Zudem werden Die Ergebnisse von cpuid in Deinem Beispiel durch rdtsc im Register eax und edx wieder überschrieben (http://faydoc.tripod.com/cpu/cpuid.htm).Gut Schuß
VuuRWerK
-
Super dankeschön,
ja es ging mir nur um die Ticks um meine Implementationen vergleichen zu können.G hibbes
-
Vor dem rdtsc sollte man noch "serialisieren", z.B. mit cpuid wie hier http://www.c-plusplus.net/forum/viewtopic-var-t-is-237896.html