Kezdőoldal » Számítástechnika » Programozás » Elmagyarázná valaki, hogy ez...

Elmagyarázná valaki, hogy ez a rövid C kód konkrétan mit csinál?

Figyelt kérdés

#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?


2011. ápr. 6. 17:26
 1/3 anonim ***** válasza:

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.

2011. ápr. 6. 18:37
Hasznos számodra ez a válasz?
 2/3 anonim ***** válasza:

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);

}


}

2011. ápr. 10. 22:26
Hasznos számodra ez a válasz?
 3/3 A kérdező kommentje:
köszi
2011. ápr. 15. 00:44

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!