Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС 2017
выпущен 15 марта!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

БОЛЬШОЙ FAQ ПО DELPHI



Получение информации о процессоре

Автор: Igor Popov

Встретились четыре компьютерщика, а бутылка ВОДКИ только одна. Мало! Долго недумая взяли и разогнали её до 400.

Если Вам необходимо не только "вычислить" частоту процессора, а и узнать о процессоре как можно больше, пожалуйста, пользуйтесь следующим модулем:


 unit ExpandCPUInfo;
 
 interface
 
 type
 
 TCPUInfo = packed record
 IDString : array [0..11] of Char;
 Stepping : Integer;
 Model    : Integer;
 Family   : Integer;
 FPU,
 VirtualModeExtensions,
 DebuggingExtensions,
 PageSizeExtensions,
 TimeStampCounter,
 K86ModelSpecificRegisters,
 MachineCheckException,
 CMPXCHG8B,
 APIC,
 MemoryTypeRangeRegisters,
 GlobalPagingExtension,
 ConditionalMoveInstruction,
 MMX     : Boolean;
 SYSCALLandSYSRET,
 FPConditionalMoveInstruction,
 AMD3DNow : Boolean;
 CPUName : String;
 end;
 {информация об идентификации процессора}
 function ExistCPUID:Boolean;
 function CPUIDInfo(out info: TCPUInfo):Boolean;
 {инф-я о технологии процессора}
 function ExistMMX:Boolean;
 function Exist3DNow:Boolean;
 function ExistKNI:Boolean;
 {------------------------}
 procedure EMMS;
 procedure FEMMS;
 procedure PREFETCH(p: Pointer); register;
 
 implementation
 
 function ExistCPUID : Boolean;
 asm
 
 pushfd
 pop eax
 mov ebx, eax
 xor eax, 00200000h
 push eax
 popfd
 pushfd
 pop ecx
 mov eax,0
 cmp ecx, ebx
 jz @NO_CPUID
 inc eax
 @NO_CPUID:
 end;
 
 function CPUIDInfo(out info: TCPUIDInfo):Boolean;
 
 function ExistExtendedCPUIDFunctions:Boolean;
 asm
 mov eax,080000000h
 db $0F,$A2
 end;
 var
 
 name : array [0..47] of Char;
 p : Pointer;
 begin
 
 if ExistCPUID then asm
 jmp @Start
 @BitLoop:
 mov al,dl
 and al,1
 mov [edi],al
 shr edx,1
 inc edi
 loop @BitLoop
 ret
 @Start:
 mov edi,info
 mov eax,0
 db $0F,$A2
 mov [edi],ebx
 mov [edi+4],edx
 mov [edi+8],ecx
 mov eax,1
 db $0F,$A2
 mov ebx,eax
 and eax,0fh;
 mov [edi+12],eax;
 shr ebx,4
 mov eax,ebx
 and eax,0fh
 mov [edi+12+4],eax
 shr ebx,4
 mov eax,ebx
 and eax,0fh
 mov [edi+12+8],eax
 add edi,24
 mov ecx,6
 call @BitLoop
 shr edx,1
 mov ecx,3
 call @BitLoop
 shr edx,2
 mov ecx,2
 call @BitLoop
 shr edx,1
 mov ecx,1
 call @BitLoop
 shr edx,7
 mov ecx,1
 call @BitLoop
 mov p,edi
 end;
 if (info.IDString = 'AuthenticAMD') and ExistExtendedCPUIDFunctions then begin
 asm
 mov edi,p
 mov eax,080000001h
 db $0F,$A2
 mov eax,edx
 shr eax,11
 and al,1
 mov [edi],al
 mov eax,edx
 shr eax,16
 and al,1
 mov [edi+1],al
 mov eax,edx
 shr eax,31
 and al,1
 mov [edi+2],al
 lea edi,name
 mov eax,0
 mov [edi],eax
 mov eax,080000000h
 db $0F,$A2
 cmp eax,080000004h
 jl @NoString
 mov eax,080000002h
 db $0F,$A2
 mov [edi],eax
 mov [edi+4],ebx
 mov [edi+8],ecx
 mov [edi+12],edx
 add edi,16
 mov eax,080000003h
 db $0F,$A2
 mov [edi],eax
 mov [edi+4],ebx
 mov [edi+8],ecx
 mov [edi+12],edx
 add edi,16
 mov eax,080000004h
 db $0F,$A2
 mov [edi],eax
 mov [edi+4],ebx
 mov [edi+8],ecx
 mov [edi+12],edx
 @NoString:
 end;
 info.CPUName:=name;
 end else with info do begin
 SYSCALLandSYSRET:=False;
 FPConditionalMoveInstruction:=False;
 AMD3DNow:=False;
 CPUName:='';
 end;
 Result:=ExistCPUID;
 end;
 
 function ExistMMX:Boolean;
 var
 
 info : TCPUIDInfo;
 begin
 
 if CPUIDInfo(info) then
 Result:=info.MMX
 else
 Result:=False;
 end;
 
 function Exist3DNow:Boolean;
 var
 
 info : TCPUIDInfo;
 begin
 
 if CPUIDInfo(info) then
 Result:=info.AMD3DNow
 else
 Result:=False;
 end;
 
 function ExistKNI:Boolean;
 begin
 
 Result:=False;
 end;
 
 procedure EMMS;
 asm
 
 db $0F,$77
 end;
 
 procedure FEMMS;
 asm
 
 db $0F,$03
 end;
 
 procedure PREFETCH(p: Pointer); register;
 asm
 
 // PREFETCH byte ptr [eax]
 end;
 
 end.
 




<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ



Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS