Datakent Ana Sayfa
Anasayfa Anasayfa > Diğer bölümler > Borland Delphi
  Aktif Konular Aktif Konular RSS: CPU bilgilerinin alınması
  Yardım Yardım  Hızlı Ara   Kayıt Ol Kayıt Ol  Giriş Giriş

CPU bilgilerinin alınması

 Yanıt Yaz Yanıt Yaz
Yazar
Mesaj
murat turan Açılır Menü Göster
Admin Group
Admin Group
Simge
Datakent

Kayıt Tarihi: 01.Ekim.2003
Bulundugu Yer: Turkey
Online: Sitede Değil
Gönderilenler: 1732
  Alıntı murat turan Alıntı  Yanıt YazCevapla Mesajın Direkt Linki Konu: CPU bilgilerinin alınması
    Gönderim Zamanı: 31.Ekim.2008 Saat 12:21
//delphi ile cpu bilgilerinin alınması
 
const
ID_BIT = $200000; // EFLAGS ID bit
type
TCPUID = array[1..4] of Longint;
TVendor = array [0..11] of char;
 
function IsCPUID_Available : Boolean;
asm
MOV Result,False {Set initial result to false}
PUSHFD {direct access to flags no possible, only via stack}
POP EAX {flags to EAX}
MOV EDX,EAX {save current flags}
XOR EAX,ID_BIT {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 Result,True {Result=True}
@exit:
end;
 
function GetCPUID(Index : Integer) : TCPUID;
asm
PUSH EBX {Save affected register}
PUSH EDI
MOV EDI,Result {Move result to EDI}
MOV EAX,Index
DW $A20F {CPUID Command we can use CPUID}
STOSD {CPUID[1]}
MOV EAX,EBX
STOSD {CPUID[2]}
MOV EAX,ECX
STOSD {CPUID[3]}
MOV EAX,EDX
STOSD {CPUID[4]}
POP EDI {Restore registers}
POP EBX
end;
 
function GetCPUVendor : TVendor;
asm
PUSH EBX {Save affected register}
PUSH EDI
MOV EDI,Result {@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;
 
procedure TForm1.Button1Click(Sender: TObject);
var
S : TCPUID;
I : Cardinal;
begin
Memo1.Clear;
if IsCPUID_Available then begin
for I:=0 to 3 do begin
S:=GetCPUID(I);
Memo1.Lines.Add(Format('%x-%x-%x-%x',[S[1],S[2],S[3],S[4]]));
end;
for I:=$80000000 to $80000003 do begin
S:=GetCPUID(I);
Memo1.Lines.Add(Format('%x-%x-%x-%x',[S[1],S[2],S[3],S[4]]));
end;
Memo1.Lines.Add(GetCPUVendor)
end
else
Memo1.Lines.Add('CPUID Not available')
end;


Düzenleyen murat_turan - 31.Ekim.2008 Saat 12:21
Yukarı Dön
 Yanıt Yaz Yanıt Yaz

Forum Atla Forum İzinleri Açılır Menü Göster



Bu Sayfa 0,109 Saniyede Yüklendi. [power by : WebWiz]