22. september 2000 - 10:28Der 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
Hos Computerworld it-jobbank er vi stolte af at fortsætte det gode partnerskab med folkene bag IT-DAY – efter vores mening Danmarks bedste karrieremesse for unge og erfarne it-kandidater.
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; }
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
Synes godt om
Ny brugerNybegynder
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.