Operand size conflict

0

Witam, mam funkcję, która pobiera informację o procesorze (family, model itd), tylko mam problem bo podczas kompilacji wyskakuje błąd "C2443: operand size conflict". Może ktoś wie o co się rozchodzi ?? Tutaj kod :

 char config_os::cpu_version_info()
{
    char VersionInfo;

    __asm
    {
        mov eax, 1
        cpuid
        mov VersionInfo, eax
    }

    qDebug() << VersionInfo << endl;

    return VersionInfo;
}

Ps. Opisany błąd dotyczy linijki "mov VersionInfo, eax"

2

char ma 1 bajt a eax ma 4

0

Dzięki, a dało by radę jednak za pomocą char ??

0

A czy dasz radę nalać litr wody do zwykłej szklanki? Do chara to możesz najwyżej ah albo al sobie wpisać.

0

Nie no to ja wiem, ale rozchodzi mi się że jak wezmę np. QString to program pada podczas uruchamiania.

QString config_os::cpu_version_info()
{
    QString VersionInfo;

    __asm
    {
        mov eax, 1
        cpuid
        mov VersionInfo, eax
    }

    qDebug() << VersionInfo << endl;

    return VersionInfo;
} 
</del>

Ps. Pobrałem do zmiennej int :)

Ps2. Mógłby ktoś wytłumaczyć o co się rozchodzi z tą liczbą 0xF0 ??

cpu_ver_inf & 0xF0) >> 4
2

Maska bitowa. 0xF0 to jest maska 1111 0000 czyli wyciągasz bity numer 5,6,7,8 a potem przesuwasz je sobie o 4 miejsca w prawo, tak żeby były najmniej znaczącymi bitami.

Jeśli twoja zmienna miała wartość np. 1010 1010 to maska 1111 0000 robi z niej 1010 0000 a potem >>4 robi z niej 1010

0

Czyli jak dobrze rozumiem to, żeby odczytać od 20 do 27 bitu to trzeba to napisać tak ??

(cpu_ver_inf & 0xFF00000 >> 20);

albo

(cpu_ver_inf >> 20) & 0xFF;
0

Nie jest ci potrzebny do tego assembler.

#include <intrin.h>

	int info[4];
	__cpuid(info, 1);

Tablica info zawiera teraz kolejno EAX, EBX, ECX i EDX po instrukcji cpuid.
Drugi parametr funkcji __cpuid() to wejściowa wartość EAX (tutaj: 1).

1

I nawet dzięki tej funkcji dam radę odczytać pełną nazwę procesora zawartą w Fn8000_0002, Fn8000_0003, Fn8000_0004 ?

Dzięki tej oraz drugiej __cpuidex() która pobiera dodatkowo ECX można zrobić wszystko co można zrobić za pomocą instrukcji cpuid.

	char cpuName[48];
	int info[4];

	__cpuid(info, 0x80000000);
	if (info[0] >= 0x80000004)
	{
		__cpuid(info, 0x80000002);
		memcpy(&cpuName[0], info, 16);
		__cpuid(info, 0x80000003);
		memcpy(&cpuName[16], info, 16);
		__cpuid(info, 0x80000004);
		memcpy(&cpuName[32], info, 16);

		printf("'%s'\n", cpuName);
	}

EDIT: dodane sprawdzanie czy funkcja jest dostępna.

1 użytkowników online, w tym zalogowanych: 0, gości: 1