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

Я пытался прочитать 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 ответа

Исходный код ядра Linux показывает, как выполнить x86-процессор с использованием встроенной сборки. Синтаксис специфичен для 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 являются входными данными, а все четыре являются выходными), вы можете легко выделить отдельные биты / байты в вызывающей программе.

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

Другие вопросы по тегам