Avatar billede borrisholt Novice
22. september 2000 - 10:28 Der er 4 kommentarer og
1 løsning

bool IsCPUID_Available ()

På Pentium familine og op efter findes der et flag i CPU\'en til der fortæller hvormange clock cycels det er siden der blev sat power på CPU\'en. Det kan bruges til at måle CPU hastighed med.

Man kan udføre en test for om det flag findes, uden direkte at til gå det. Til det formål har jeg skrevet det følgende kode i Visual C++  :

bool IsCPUID_Available ()
{
  __asm
  {
    PUSHFD                       //direct access to flags no possible, only via stack
    POP    EAX                  //flags to EAX
    MOV    EDX,EAX            //save current flags
    XOR    EAX,0x200000    //not ID bit
    PUSH    EAX                //onto stack
    POPFD                    //from stack to flags, with not ID bit
    PUSHFD                    //back to stack
    POP    EAX                //get back to EAX
    XOR    EAX,EDX            //check if ID bit affected
    JZ      exit            //no, CPUID not availavle
    MOV    AL,1            //Result=True
    exit:
  }
}

Det kompilerer også fint. Problemer er bare jeg også skal have det til at kompilere under Borlands C++ 5.0.

Der er 100 point til den der kommer med en løsning der kompilerer under borlands C++ 5.0

Jens B
Avatar billede soepro Nybegynder
22. september 2000 - 11:53 #1
Nogle af de andvendte ASM instruktioner, er kun tilgængelige hvis du genererer Pentium kode. Det kan du kun gøre hvis du anvender 32-bit compileren i BC++ 5.02, dvs. dit taget skal være Win32 (Console). Det klarer du ved at vælge \'Options\'-\'Project\'-\'32 bit Compiler/Processor\' og klikke på \'Pentium\'. Dernæst skal du højreklikke på \'Target\' noden i projekt-vinduet (eller trykke Alt+F10) og vælge \'TargetExpert\', og heri \'Win32\' + \'Console\'. Jeg har ikke TASM32 på min maskine, men koden \"æder\" den uden problemer:

#include <conio.h>

bool IsCPUID_Available (void)
{
  int      result = 0;
  asm
  {
    PUSHFD                //direct access to flags no possible, only via stack
    POP    EAX            //flags to EAX
    MOV    EDX,EAX        //save current flags
    XOR    EAX,0x200000    //not ID bit
    PUSH  EAX            //onto stack
    POPFD                  //from stack to flags, with not ID bit
    PUSHFD                //back to stack
    POP    EAX            //get back to EAX
    XOR    EAX,EDX        //check if ID bit affected
    JZ      exit          //no, CPUID not availavle
    MOV    AL,1            //Result=True
    MOV    result, AL
    exit:
  }
  return result;
}

int main(void)
{
  clrscr();
  cprintf(\"Resultatet er: %u\", IsCPUID_Available());
  return 0;
}
Avatar billede soepro Nybegynder
22. september 2000 - 11:55 #2
Du kan evt. erstatte PUSHFD/POPFD med PUSH FLAGS/POP FLAGS.
Avatar billede borrisholt Novice
22. september 2000 - 11:57 #3
har du tilfeldig vil også en TASM32 jeg kan ikke finde min ..

Jeg skall lige have det kompileret før du får dine point

Jens B
Avatar billede borrisholt Novice
22. september 2000 - 11:58 #4
du kan evt maileden til Jens@Borrisholt.com
Avatar billede borrisholt Novice
22. september 2000 - 12:33 #5
Nå men det virker sikkert. Den eneste compiler fejl jeg får er at den ikke kan finde TASM32.EXE . Hvis det er lovlig må du eller andre MEGET gerne sende mig TASM32.EXE pr. email.

Jens B
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