C ++ слово в байтах - PullRequest
       52

C ++ слово в байтах

2 голосов
/ 11 марта 2010

Я пытался прочитать CPUID, используя ассемблер в C ++. Я знаю, что есть функция для этого, но я хочу Asm способ. Таким образом, после выполнения CPUID он должен заполнить регистры eax, ebx, ecx кодированной строкой ASCII. Но моя проблема в том, что, поскольку я могу в asm адресовать только полный или половинный регистр, как разбить эти 32 бита на 4 байта. Я использовал это:

#include <iostream>
#include <stdlib.h>

int main()
{
_asm
{
cpuid
/*There I need to mov values from eax,ebx and ecx to some propriate variables*/
}
system("PAUSE");
return(0);  
}

Ответы [ 2 ]

2 голосов
/ 11 марта 2010

Источник ядра Linux показывает, как выполнить x86 cpuid, используя встроенную сборку. Синтаксис специфичен для GCC; если вы работаете в Windows, это, вероятно, не поможет.

static inline void native_cpuid(unsigned int *eax, unsigned int *ebx,
                                unsigned int *ecx, unsigned int *edx)
{
        /* ecx is often an input as well as an output. */
        asm volatile("cpuid"
            : "=a" (*eax),
              "=b" (*ebx),
              "=c" (*ecx),
              "=d" (*edx)
            : "0" (*eax), "2" (*ecx));
}

Если у вас есть функция в этом формате (обратите внимание, что EAX, ECX являются входными данными, а все четыре являются выходными), вы можете легко выделить отдельные биты / байты в вызывающей стороне.

0 голосов
/ 11 марта 2010

Я не понимаю, почему вы все равно не используете предоставленную функцию

...