header image
 

Melihat PSN(Processor Serial Number) with Delphi

       

      

      

       

       

       

      

      

       

       

             

             

            

            

             

             

             

            

            

             

             

             

            

         

Mengetahui PSN
(Processor Serial Number)
               

                Author: Ario Sutomo
                Published: September 20, 2005
                Visits: 2788 - Category:

Borland Delphi

       

 
     
           
            
             
               

             

            

                  

         

PSN merupakan suatu deretan nomor seri 96-bit yang tertera pada
prosesor keluaran Intel (mulai Pentium III) untuk keperluan
identifikasi. PSN bisa didapatkan dengan menggunakan instruksi CPUID
(disarankan untuk membaca artikel sebelumnya yang membahas
penggunaan instruksi CPUID untuk identifikasi prosesor, Anda bisa
mencarinya dengan kata kunci cpuid pada situs ini).

Algoritma

  1. Untuk mendapatkannya, pertama-tama kita harus memeriksa
    komputer kita apakah mendukung instruksi CPUID atau tidak.
    Caranya yaitu dengan memeriksa bit ke-21 dari EFLAGS. Jika bit
    tersebut bisa diubah, berarti prosesor kita mendukung instruksi
    CPUID.
  2. Selanjutnya jika prosesor kita mendukung instruksi CPUID,
    periksa juga apakah prosesor kita memiliki fitur PSN atau tidak.
    Caranya dengan menjalankan instruksi CPUID dengan parameter di
    EAX diisi dengan nilai 1.

    MOV EAX, 1
    DW 0A20Fh //opcode CPUID

    Jika setelah dijalankan bit ke-18 pada register EDX bernilai
    “1”, maka prosesor kita sudah mendukung fitur PSN. Jika
    sebaliknya, ada dua kemungkinan: prosesor kita tidak mendukung
    fitur PSN atau fitur PSN tersebut dinonaktifkan (disabled).

  3. Setelah tahu prosesor kita mendukung fitur PSN, kita tinggal
    mendapatkan nilai PSN tersebut. Perlu diketahui bahwa PSN
    (96-bit) merupakan gabungan dari tiga entitas 32-bit.

    32-bit pertama (most significant bits, MSB) didapatkan dengan
    cara mengisi angka “1” ke register EAX dan mengeksekusi
    instruksi CPUID, sebagai berikut:

    MOV EAX, 1
    DW 0A20Fh //opcode CPUID

    Setelah eksekusi, register EAX berisi Processor Signature, yang
    tidak lain adalah 32-bit pertama dari PSN. Nilai ini perlu kita
    simpan terlebih dahulu ke dalam suatu variabel untuk digabungkan
    nantinya dengan 64-bit sisanya.

  4. 64-bit sisanya bisa didapatkan dengan cara mengisi angka “3”
    ke register EAX dan mengeksekusi instruksi CPUID, sebagai
    berikut:

    MOV EAX, 3
    DW 0A20Fh //opcode CPUID

    Setelah eksekusi, register EDX berisi 32-bit PSN yang kedua
    (middle bits), dan register ECX berisi 32-bit terakhir (least
    significant bits, LSB). Jadi, jika nilai processor signature
    (yang didapatkan pada langkah ke-3), EDX, dan ECX digabungkan,
    akan membentuk PSN 96-bit yang lengkap.

  5. PSN harus ditampilkan sebagai 6 kelompok dari 4 digit heksa
    (XXXX-XXXX-XXXX-XXXX-XXXX-XXXX dimana X menyatakan satu digit
    heksa).

Membuat Program
Buatlah project baru yang terdiri dari satu form yang didalamnya
terdapat satu komponen label sebagai berikut.


Gambar 1. Rancangan form.

Ubahlah properties dari form dan komponennya tersebut berdasarkan
tabel 1 berikut.

Tabel 1. Daftar properties yang harus dirubah.

Kemudian, algoritma yang sudah dijelaskan sebelumnya kita coba
konversi ke dalam satu fungsi GetPSN sebagai berikut:

function
TForm1.GetPSN: string;
var
  //variabel2x u/ menyimpan bagian2x PSN
  rEAX, rEDX, rECX : Cardinal;

  //variabel u/ status prosesor
  iCPUID, fPSN : byte;
begin
  asm
    //inisialisasi
    mov iCPUID, 0
    mov fPSN, 0
    mov rEAX, 0
    mov rEDX, 0
    mov rECX, 0

    //buat jaga-jaga kita "selamatkan" dulu isi register
    //untuk dikembalikan lagi setelah selesai
    push eax
    push ebp
    push ebx
    push ecx
    push edi
    push edx
    push esi

    //periksa dulu apakah prosesor mendukung instruksi CPUID
    @@Check_CPUID:
    pushfd //ambil nilai EFLAGS…
    pop eax //…simpan di register EAX
    mov ecx, eax //copy ke register ECX
    xor eax, 200000h //ubah bit ke-21
    push eax //kembalikan…
    popfd //…masukkan ke EFLAGS
    pushfd //ambil lagi EFLAGS…
    pop eax //…untuk di simpan ke register EAX
    cmp eax, ecx //bandingkan EAX dengan ECX
    je @@Selesai //jika sama…
    //…berarti tidak mendukung instruksi CPUID
    //langsung loncat ke @@Selesai
    mov iCPUID, 1 //beri tanda bahwa prosesor kita mendukung
CPUID

    //jika masuk ke "zona" ini berarti prosesor mendukung CPUID
    @@InstruksiCPUID:
    mov eax, 1 //parameter 1
    dw 0A20Fh //CPUID

    and eax, 40000h //periksa bit ke-18
    cmp eax, 1 //jika bernilai 1, berarti ada PSN-nya
    jne @@Selesai //jika tidak sama dengan 1, loncat ke selesai
    mov fPSN, 1 //beri tanda bahwa prosesor kita ada PSN-nya

    //Sekarang mulai mengambil PSN "satu-persatu"
    mov eax, 1 //parameter 1
    dw 0A20Fh //CPUID
    mov rEAX, eax //masukkan 32-bit pertama ke variabel rEAX

    mov eax, 3 //parameter 3
    dw 0A20Fh //CPUID
    mov rEDX, edx //masukkan 32-bit kedua ke variabel rEDX
    mov rECX, ecx //masukkan 32-bit terakhir ke variabel rECX

    @@Selesai:
    //kembalikan isi register kepada sebelum kita menjalankan
    //prosedur ini
    pop esi
    pop edx
    pop edi
    pop ecx
    pop ebx
    pop ebp
    pop eax
  end;

  if iCPUID=0 then
    Result := ‘No CPUID instruction!’
  else if fPSN=0 then
    Result := ‘No PSN feature!’
  else begin
    Result := Format(’%s-%s-%s-%s-%s-%s’, [
    IntToHex(HiWord(rEAX),4),
    IntToHex(LoWord(rEAX),4),
    IntToHex(HiWord(rEDX),4),
    IntToHex(LoWord(rEDX),4),
    IntToHex(HiWord(rECX),4),
    IntToHex(LoWord(rECX),4)]);
  end;
end;

Selanjutnya, fungsi tersebut kita panggil melalui event OnShow
pada form sebagai berikut:

procedure
TForm1.FormShow(Sender: TObject);
begin
  labelPSN.Caption := GetPSN;
end;

PERLU DICATAT!!! Karena kesulitan mencari prosesor Intel Pentium
yang mengaktifkan fitur PSN, sampai saat ini program tersebut belum
pernah diuji coba. Namun, secara teoritis (tentunya berdasarkan
dokumentasi yang ada) program di atas seharusnya sudah benar.

Tulisan ini dibuat sebagai “tanggapan” atas “kritikan” para
pembeli buku saya yang berjudul Borland Delphi Win32 API, perihal
tidak dijelaskannya cara-cara mendapatkan Processor Serial Number
(PSN). Semoga dengan tulisan ini, bisa memuaskan para pembaca buku
Borland Delphi Win32 API pada khususnya dan para pengunjung situs
Sony AK Knowledge Center pada umumnya.

Jika diantara pembaca yang mencoba program di atas pada prosesor
yang ada PSN-nya, mohon kesediaannya untuk mengirimkan contoh output
tampilan programnya. Terima kasih.

Referensi:

  • Ario Sutomo, Borland Delphi Win32 API, Jakarta: Dinastindo,
    2005.
  • Intel Processor Identification and the CPUID Instruction,
    Application Note 486, February 2004, Intel Corporation.

Demikian tulisan mengenai cara mengetahui processor serial number
dengan menggunakan Borland Delphi. Semoga
bermanfaat bagi Anda semuanya. Jika ada saran atau komentar bisa
dilayangkan ke

arioss@softhome.net
. Untuk membaca tulisan menarik lainnya
silakan menuju ke situs Sony AK Knowledge Center dengan alamat di

www.sony-ak.com
.

            
             
               

               

             

            

Silakan download source code lengkap dari
                  project di atas

            

Terima kasih.

         

~ by dimassasongko on January 16, 2008.

Leave a Reply