Ответ 1
В режиме x86-64 RDTSC также очищает более высокие 32 бит RAX. Чтобы компенсировать эти биты, мы должны сдвинуть hi налево на 32 бита.
Я знаю, что rdtsc
загружает текущее значение счетчика времени обработки процессора в два регистра: EDX и EAX. Чтобы получить его на x86, мне нужно сделать это так (при использовании Linux):
unsigned long lo, hi;
asm( "rdtsc" : "=a" (lo), "=d" (hi));
return lo;
и для x86_x64:
unsigned long lo, hi;
asm( "rdtsc" : "=a" (lo), "=d" (hi) );
return( lo | (hi << 32) );
почему? Может ли кто-нибудь объяснить это мне?
В режиме x86-64 RDTSC также очищает более высокие 32 бит RAX. Чтобы компенсировать эти биты, мы должны сдвинуть hi налево на 32 бита.
Разница не в rdtsc
, а в том, что ядро Linux хочет сделать с ней.
В 32 бит он возвращает 32-битное значение. Таким образом, значение в eax достаточно хорошее.
В 64 бит он возвращает 64-битное значение. Поэтому ему нужно совместить значения из обоих регистров.