Почему я должен использовать 'rdtsc' по-другому на x86 и x86_x64? - программирование
Подтвердить что ты не робот

Почему я должен использовать 'rdtsc' по-другому на x86 и x86_x64?

Я знаю, что 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) );

почему? Может ли кто-нибудь объяснить это мне?

4b9b3361

Ответ 1

В режиме x86-64 RDTSC также очищает более высокие 32 бит RAX. Чтобы компенсировать эти биты, мы должны сдвинуть hi налево на 32 бита.

Ответ 2

Разница не в rdtsc, а в том, что ядро ​​Linux хочет сделать с ней.

В 32 бит он возвращает 32-битное значение. Таким образом, значение в eax достаточно хорошее.
В 64 бит он возвращает 64-битное значение. Поэтому ему нужно совместить значения из обоих регистров.