Avatar billede viht Nybegynder
13. november 2002 - 15:32 Der er 2 kommentarer og
1 løsning

Forklaring @ soreno

Jeg henviser til http://www.eksperten.dk/spm/277815 og følgende kode:

Hvad gør nedestående kald præcist? Henter hvad der står på de adresser og lægger dem ind i de long's der er defineret?

asm(".byte 0x0f, 0xa2" : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) : "a" (0));
  char vendorID[64] = "";
  int i=0;
  int ch=0;

Hvad gør du i denne for løkke?
  for(i = 0; i < 4; i++) {
      vendorID[ch] = ebx >> (8*i);
      ch++;
  }

  for(i = 0; i < 4; i++) {
      vendorID[ch] = edx >> (8*i);
      ch++;
  }

  for(i = 0; i < 4; i++) {
      vendorID[ch] = ecx >> (8*i);
      ch++;
  }
 
  //CPUID
Her kommer du så nogle nye værdier ind i eax,ebx,ecx og edx?
  asm(".byte 0x0f, 0xa2" : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) : "a" (1));
Hvad gør du her?
  model = (eax >> 4) & 0xf;
  family = (eax >> 8) & 0xf;
Avatar billede soreno Praktikant
14. november 2002 - 13:31 #1
Al assembler er forklaret her:
http://www.delorie.com/djgpp/doc/brennan/brennan_att_inline_djgpp.html

MinGW (gcc) benytter AT&T syntaks mens stort set alle andre kompiler familier benytter Intel syntaks - men det er beskrevet i linket.

asm(".byte 0x0f, 0xa2" : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) : "a" (0));

".byte 0x0f, 0xa2"
Er opkoden for CPUID instruktionen - der findes muligvis en symbolsk instruktion der repræsenterer denne (f.eks. lige som mov og xor), men jeg ved det ikke.

: "a" (0)
Lægger 0 over i eax (inden instruktionen udføres).

"=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
Lægger resultatet af CPUID over i eax, ebx, ecx, edx

Producent ID ligger i ebx, edx og ecx.
For løkkerne spiltter registrene op i 8 bit bidder (1 Byte) (eax er f.eks. 32 bit). På den måde får man char værdien af producent ID. Derefter kan man udskrive "vendorID" som så indeholder f.eks. "GenuineIntel".


model = (eax >> 4) & 0xf;
Skifter indholdet af eax 4 pladser til højre og AND'er med 0xf
På den måde henter man de bits der repræsenterer model nummeret. Det er vist nok beskreven i dette link:
http://www.ka9q.net/code/cpuid/cpuid-3.3.tar.gz


Håber det hjalp lidt :-)
Avatar billede soreno Praktikant
14. november 2002 - 13:34 #2
eax >> 4
er det samme som
eax = eax / 2;
eax = eax / 2;
eax = eax / 2;
eax = eax / 2;
Avatar billede viht Nybegynder
14. november 2002 - 14:05 #3
Ja, det er fint. Jeg havde mere eller mindre forstået hvad der skete før og i for løkkerne, men det nederste havde jeg ingen anelse om hvad var. Før nu! Tak for det.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester