Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.01.23;
Скачать: CL | DM;

Вниз

Программное определение типа процессора   Найти похожие ветки 

 
Abzetdin   (2002-12-07 13:10) [0]

Поржалуйста, подскажите програмно определить тип процессора?
Только не просто 486 ли 586, а более точно Pentium II/III/IV или Celeron т.е. SystemInfo() не годится.

Благодарю


 
Marser ©   (2002-12-07 16:58) [1]

Более точно стандартными средствами не удастся.Может в CMOS или ещё где.


 
Ich Hasse ©   (2002-12-07 17:27) [2]

1. Поддержка технологии 3DNow!

{$ifndef ver80} // так как будем использовать 32-битный регистр
function Get3DNowSupport: Boolean; assembler;
asm
push ebx
mov @Result, True
mov eax, $80000000
dw $A20F
cmp eax, $80000000
jbe @NOEXTENDED // 3DNow не поддерживается
mov eax, $80000001
dw $A20F
test edx, $80000000
jnz @EXIT // 3DNow поддерживается
@NOEXTENDED:
mov @Result, False
@EXIT:
pop ebx
end;
{$endif}


2. Производитель процессора

function GetCPUVendor : TVendor; assembler; register;
asm
PUSH EBX {Save affected register}
PUSH EDI
MOV EDI,EAX {@Result (TVendor)}
MOV EAX,0
DW $A20F {CPUID Command}
MOV EAX,EBX
XCHG EBX,ECX {save ECX result}
MOV ECX,4
@1:
STOSB
SHR EAX,8
LOOP @1
MOV EAX,EDX
MOV ECX,4
@2:
STOSB
SHR EAX,8
LOOP @2
MOV EAX,EBX
MOV ECX,4
@3:
STOSB
SHR EAX,8
LOOP @3
POP EDI {Restore registers}
POP EBX
end;


3. Тип процессора из реестра

function GetCPUType: string;
var
m_reg: TRegistry;
begin
m_reg:=TRegistry.Create;
m_reg.RootKey:=HKEY_LOCAL_MACHINE;
try
if m_reg.OpenKey("HARDWARE\DESCRIPTION\System\CentralProcessor\0", True) then
begin
try
Result:=m_reg.ReadString("Identifier");
except
Result:="Unknown";
end;
m_reg.CloseKey;
end;
finally
m_reg.Free;
end;
end;


4. Простой тип процессора

function GetCPUNumber: string;
var
Struc: _SYSTEM_INFO;
begin
GetSystemInfo(Struc);
Result:=IntToStr(Struc.dwNumberOfProcessors);
end;

function GetCPULevel: string;
var
Struc: _SYSTEM_INFO;
begin
GetSystemInfo(Struc);
Case Struc.wProcessorLevel of
3: Result:="Intel 80386";
4: Result:="Intel 80486";
5: Result:="Intel Pentium";
6: Result:="Intel Pentium II or better";
end;
end;


 
Ich Hasse ©   (2002-12-07 17:29) [3]

Вот все, что тебе может понадобиться... (надеюсь)

Может ты мне дашь ответ?
Почему весь белый свет
Обозлился на меня?
Для чего родился я?


 
rastochnik ©   (2002-12-07 17:47) [4]

используй com-объекты WMI - на msdn поиск по SWbemLocator, Win32_Processor - там инфы про процессор очень много



 
apay ©   (2002-12-07 21:39) [5]

от 80806 до 80486 -- cpuid.asm (в example-ах кажется tasm 5.0)
AMD процессоры старше 486 -- см. на сайте AMD, примеров всяких и программок полно)
Intel процессоры -- аналогично, но на сайте Intel.
за пол-часа все это можно спокойно скачать.

2 Ich Hasse
Поэтом быть не так легко,
Стихи и рифмы составлять словами,
Но им, поэтам, не дано
Понять всю красоту программы...

Вааще-то это не парнас, а форум программеров :))


 
TankMan ©   (2002-12-10 00:00) [6]

>> Ich Hasse
А что за TVendor?


 
bak ©   (2002-12-10 09:31) [7]

давненько лабал - могет разгребешь


procedure TForm1.Button8Click(Sender: TObject);
type
regconvert = record
bits0_7: Byte;
bits8_15: Byte;
bits16_23: Byte;
bits24_31: Byte;
end;
var
CPUInfo: TCpuInfo;
TEBX, TEDX, TECX: Cardinal;
TString: String;
VString: String;
begin
asm
MOV [CPUInfo.PType], 0
MOV [CPUInfo.Model], 0
MOV [CPUInfo.Stepping], 0
MOV [CPUInfo.Features], 0
// MOV [CPUInfo.Frequency_Info.Raw_Freq], 0
// MOV [CPUInfo.Frequency_Info.Norm_Freq], 0
// MOV [CPUInfo.Frequency_Info.In_Cycles], 0
// MOV [CPUInfo.Frequency_Info.Ex_Ticks], 0

push eax
push ebp
push ebx
push ecx
push edi
push edx
push esi

@@Check_80486:
MOV [CPUInfo.Family], 4
MOV TEBX, 0
MOV TEDX, 0
MOV TECX, 0
PUSHFD
POP EAX
MOV ECX, EAX
XOR EAX, 200000H
PUSH EAX
POPFD
PUSHFD
POP EAX
XOR EAX, ECX
JE @@DONE_CPU_TYPE

@@Has_CPUID_Instruction:
MOV EAX, 0
DB 0FH
DB 0A2H

MOV TEBX, EBX
MOV TEDX, EDX
MOV TECX, ECX

MOV EAX, 1
DB 0FH
DB 0A2H

MOV [CPUInfo.Features], EDX

MOV ECX, EAX

AND EAX, 3000H
SHR EAX, 12
MOV [CPUInfo.PType], AL

MOV EAX, ECX

AND EAX, 0F00H
SHR EAX, 8
MOV [CPUInfo.Family], AL

MOV EAX, ECX

AND EAX, 00F0H
SHR EAX, 4
MOV [CPUInfo.MODEL], AL

MOV EAX, ECX

AND EAX, 000FH
MOV [CPUInfo.Stepping], AL

@@DONE_CPU_TYPE:

pop esi
pop edx
pop edi
pop ecx
pop ebx
pop ebp
pop eax
end;



 
bak ©   (2002-12-10 09:32) [8]

продолжение...



If (TEBX = 0) and (TEDX = 0) and (TECX = 0) and (CPUInfo.Family = 4) then
begin
CPUInfo.VendorIDString := "Unknown";
CPUInfo.Manufacturer := "Unknown";
CPUInfo.CPU_Name := "Generic 486";
end
else
begin
With regconvert(TEBX) do
begin
TString := CHR(bits0_7) + CHR(bits8_15) + CHR(bits16_23) + CHR(bits24_31);
end;
With regconvert(TEDX) do
begin
TString := TString + CHR(bits0_7) + CHR(bits8_15) + CHR(bits16_23) + CHR(bits24_31);
end;
With regconvert(TECX) do
begin
TString := TString + CHR(bits0_7) + CHR(bits8_15) + CHR(bits16_23) + CHR(bits24_31);
end;
VString := TString;
CPUInfo.VendorIDString := TString;
If (CPUInfo.VendorIDString = "GenuineIntel") then
begin
CPUInfo.Manufacturer := "Intel";
Case CPUInfo.Family of
4: Case CPUInfo.Model of
1: CPUInfo.CPU_Name := "Intel 486DX Processor";
2: CPUInfo.CPU_Name := "Intel 486SX Processor";
3: CPUInfo.CPU_Name := "Intel DX2 Processor";
4: CPUInfo.CPU_Name := "Intel 486 Processor";
5: CPUInfo.CPU_Name := "Intel SX2 Processor";
7: CPUInfo.CPU_Name := "Write-Back Enhanced Intel DX2 Processor";
8: CPUInfo.CPU_Name := "Intel DX4 Processor";
else CPUInfo.CPU_Name := "Intel 486 Processor";
end;
5: CPUInfo.CPU_Name := "Pentium";
6: Case CPUInfo.Model of
1: CPUInfo.CPU_Name := "Pentium Pro";
3: CPUInfo.CPU_Name := "Pentium II";
else CPUInfo.CPU_Name := Format("P6 (Model %d)", [CPUInfo.Model]);
end;
else CPUInfo.CPU_Name := Format("P%d", [CPUInfo.Family]);
end;
end
else if (CPUInfo.VendorIDString = "CyrixInstead") then
begin
CPUInfo.Manufacturer := "Cyrix";
Case CPUInfo.Family of
5: CPUInfo.CPU_Name := "Cyrix 6x86";
6: CPUInfo.CPU_Name := "Cyrix M2";
else CPUInfo.CPU_Name := Format("%dx86", [CPUInfo.Family]);
end;
end
else if (CPUInfo.VendorIDString = "AuthenticAMD") then
begin
CPUInfo.Manufacturer := "AMD";
Case CPUInfo.Family of
4: CPUInfo.CPU_Name := "Am486 or Am5x86";
5: Case CPUInfo.Model of
0: CPUInfo.CPU_Name := "AMD-K5 (Model 0)";
1: CPUInfo.CPU_Name := "AMD-K5 (Model 1)";
2: CPUInfo.CPU_Name := "AMD-K5 (Model 2)";
3: CPUInfo.CPU_Name := "AMD-K5 (Model 3)";
6: CPUInfo.CPU_Name := "AMD-K6";
else CPUInfo.CPU_Name := "Unknown AMD Model";
end;
else CPUInfo.CPU_Name := "Unknown AMD Chip";
end;
end
else
begin
CPUInfo.VendorIDString := TString;
CPUInfo.Manufacturer := "Unknown";
CPUInfo.CPU_Name := "Unknown";
end;
end;
// Result := CPUInfo;
Memo2.Clear;
Memo2.Lines.Add(CPUInfo.Manufacturer);
Memo2.Lines.Add(CPUInfo.CPU_Name);
end;

Тяжело мне самому
Баги исправлять,
Но надоело в форуме
Всем надоедать!



Страницы: 1 вся ветка

Текущий архив: 2003.01.23;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.016 c
1-72312
S.P.I.R.I.T
2003-01-15 06:31
2003.01.23
Снимок диска


3-72150
denis24
2003-01-03 15:48
2003.01.23
Отлавливание ошибок при соединении database


1-72319
Gumbert-Gumbert
2003-01-15 15:58
2003.01.23
Как с помощью директив компилятора определить, что стоит WinXP?


3-72094
Smirnoff
2002-12-28 14:58
2003.01.23
Помогите! Какая то странная ошибка


3-72114
Elshad
2002-12-25 14:53
2003.01.23
Версия Microsoft Jet OLE DB