このコードに出くわしたので、それが何をしているのかを理解する必要があります。2バイトを宣言してから何もしていないようです...
uint64_t x;
__asm__ __volatile__ (".byte 0x0f, 0x31" : "=A" (x));
ありがとう!
このコードに出くわしたので、それが何をしているのかを理解する必要があります。2バイトを宣言してから何もしていないようです...
uint64_t x;
__asm__ __volatile__ (".byte 0x0f, 0x31" : "=A" (x));
ありがとう!
これにより、2 バイト (0F 31) がコード ストリームに直接生成されます。これは RDTSC 命令であり、タイムスタンプ カウンターを EDX:EAX に読み込み、出力制約 "=A"(x) によって変数 'x' にコピーされます。
0F 31 は、RDTSC (読み取りタイム スタンプ カウンター) 命令の x86 オペコードです。読み取った値を EDX および EAX レジスタに配置します。
_ _ asm__ ディレクティブは、2 バイトを宣言するだけでなく、インライン アセンブリを C コードに配置します。おそらく、プログラムには、これらのレジスタの値を直後に使用する方法があります。
このサイトによると、0F 31 オペコードを挿入しています。
0F 31 P1+ f2 RDTSC EAX EDX IA32_T... Read Time-Stamp Counter
x
次に、結果を変数に格納しています