“ rdtsc”:“ = a”(a0),“ = d”(d0)这是做什么的?

Man*_*i S 3 c++ x86 gcc inline-assembly rdtsc

我是C ++和基准测试的新手

我不明白这段代码的作用是什么?因此,我找到了一些有关edx,eax寄存器的信息,但是我不完全了解它如何在代码中发挥作用。所以我理解这段代码本质上返回了cpu周期的当前滴答声。因此,它是否将当前的滴答存储在寄存器中,一部分存储在hi中,另一部分存储在lo中。并且,“ = a”和“ = d”是否指定将其存储在哪个寄存器中。

将其分为两个部分的意义何在?

"rdtsc" : "=a" (lo), "=d" (hi) 
Run Code Online (Sandbox Code Playgroud)

上下文中的代码:

int64_t rdtsc(){
    unsigned int lo,hi;
    __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
    return ((uint64_t)hi << 32) | lo;
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*kis 6

它使用内联汇编来调用rdtsc操作码,该操作码返回64位整数。高部分存储到hi,低部分存储到lo

在Windows和Visual Studio中,内联汇编在x64中不可用,您可以使用__rdtsc

  • 在gcc(且兼容)中,还存在[__builtin_ia32_rdtsc()](/sf/answers/1908047711/)。我是https://gcc.gnu.org/wiki/DontUseInlineAsm的忠实拥护者(说这是写它的人)。 (2认同)