Elmagyarázná valaki, hogy ez a rövid C kód konkrétan mit csinál?
#include <stdio.h>
main()
{
char *a,*b,*c;
__asm
{
MOV EAX, 0
CPUID
MOV a,EBX
MOV b,EDX
MOV c,ECX
}
printf("\n%.4s%.4s%.4s\n\n",&a,&b,&c);
return(0);
}
Azt tudom, hogy kiírja a proci típusát, de honnan nyeri?
MOV EAX, 0
CPUID
MOV a,EBX
MOV b,EDX
MOV c,ECX
}
Ez a rész irányít a BIOS-ba madj leolvassa,
printf("\n%.4s%.4s%.4s\n\n",&a,&b,&c);
Ez pedig kiíratja a BIOS-sal.
MOV EAX, 0
0-t rak az EAX regiszterbe
CPUID
A processzornak van egy ilyen utasítása, ami látja, hogy az EAX-ből, hogy te a 0. parancsot akarod kérni, vagyis, hogy a processzor típusát tegye bele az EBX, EDX, ECX regiszterekbe 4 karakterenként.
MOV a,EBX
MOV b,EDX
MOV c,ECX
Az C-ben deklarált a,b,c, tömbökbe átmásolja a karaktersort.
printf("\n%.4s%.4s%.4s\n\n",&a,&b,&c);
Kiírja a karaktersort, így:
\n újsor
%.4s 4 karakteres szöveg
De amúgy sztem szar ez a kód, mert az a,b,c-nek nem is foglalt le helyet, a printf-be pedig a sztringnél nem is kell &(address of)
sztem így kéne az egészet, bár nem tudom tesztelni mert én gcc-t használok :
char a[4],b[4],c[4];
__asm
{
MOV EAX, 0
CPUID
MOV a,EBX
MOV b,EDX
MOV c,ECX
}
printf("\n%.4s%.4s%.4s\n\n",a,b,c);
Vagy amit én írtam gcc-ben és megy, egész sok infót kiír:
#include <stdio.h>
void cpuid(int* regBuf, int input)
{
register int eax asm("eax");
register int ebx asm("ebx");
register int ecx asm("ecx");
register int edx asm("edx");
eax = input;
asm("cpuid");
regBuf[0] = eax;
regBuf[1] = ebx;
regBuf[2] = ecx;
regBuf[3] = edx;
return;
}
int main()
{
int b[4];
cpuid(b,0);
printf("Vendor ID: \"%.4s%.4s%.4s\"\n", b+1, b+3, b+2);
printf("Highest Basic Calling Parameter: %08X\n", b[0]);
cpuid(b,0x80000000);
printf("Highest Extended Calling Parameter: %08X\n", b[0]);
int hxcp = b[0];
if(hxcp >= 0x80000004)
{
printf("Brand: \"");
for(unsigned i=0x80000002; i<=0x80000004; i++)
{
cpuid(b,i);
printf("%.16s",b);
}
printf("\"\n");
}
if(hxcp >= 0x80000005)
{
cpuid(b,0x80000005);
printf("L1 Cache size: %dKB\n",b[2]>>24);
}
if(hxcp >= 0x80000006)
{
cpuid(b,0x80000006);
printf("L2 Cache size: %dKB\n",b[2]>>16);
printf("L3 Cache size: %dKB\n",b[3]>>18);
}
}
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!