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