::: 델파이 Tip&Trick :::

델파이 Tip&Trick 성격에 맞지 않는 광고,비방,질문의 글은 즉시 삭제하며
내용을 복사하여 사용할 경우 반드시 이곳(http://www.howto.pe.kr)을 출처로 명시하여 주세요


Category

  김영대(2003-03-07 10:19:05, Hit : 4811, Vote : 1195
 CPU 종류 구하기

unit CpuId;

interface

type
  TCpuType = (cpu8086, cpu80286, cpu386, cpu486, cpuPentium);

{ Return the type of the current CPU }
function CpuType: TCpuType;

{ Return the type as a short string }
function CpuTypeString: String;

implementation

uses SysUtils;

function CpuType: TCpuType; assembler;
asm
  push DS

  { First check for an 8086 CPU }
  { Bits 12-15 of the FLAGS register are always set on the }
  { 8086 processor. }
  pushf            { save EFLAGS }
  pop bx           { store EFLAGS in BX }
  mov ax,0fffh     { clear bits 12-15 }
  and ax,bx        { in EFLAGS }
  push ax          { store new EFLAGS value on stack }
  popf             { replace current EFLAGS value }
  pushf            { set new EFLAGS }
  pop ax           { store new EFLAGS in AX }
  and ax,0f000h    { if bits 12-15 are set, then CPU }
  cmp ax,0f000h    { is an 8086/8088 }
  mov ax, cpu8086  { turn on 8086/8088 flag }
  je @@End_CpuType

  { 80286 CPU check }
  { Bits 12-15 of the FLAGS register are always clear on the }
  { 80286 processor. }
  or bx,0f000h     { try to set bits 12-15 }
  push bx
  popf
  pushf
  pop ax
  and ax,0f000h    { if bits 12-15 are cleared, CPU=80286 }
  mov ax, cpu80286 { turn on 80286 flag }
  jz @@End_CpuType

  { To test for 386 or better, we need to use 32 bit instructions,
    but the 16-bit Delphi assembler does not recognize the 32 bit opcodes
    or operands.  Instead, use the 66H operand size prefix to change
    each instruction to its 32-bit equivalent. For 32-bit immediate
    operands, we also need to store the high word of the operand immediately
    following the instruction.  The 32-bit instruction is shown in a comment
    after the 66H instruction.
  }

  { i386 CPU check }
  { The AC bit, bit #18, is a new bit introduced in the EFLAGS }
  { register on the i486 DX CPU to generate alignment faults. }
  { This bit can not be set on the i386 CPU. }

  db 66h           { pushfd }
  pushf
  db 66h           { pop eax }
  pop ax           { get original EFLAGS }
  db 66h           { mov ecx, eax }
  mov cx,ax        { save original EFLAGS }
  db 66h           { xor eax,40000h }
  xor ax,0h        { flip AC bit in EFLAGS }
  dw 0004h
  db 66h           { push eax }
  push ax          { save for EFLAGS }
  db 66h           { popfd }
  popf             { copy to EFLAGS }
  db 66h           { pushfd }
  pushf            { push EFLAGS }
  db 66h           { pop eax }
  pop ax           { get new EFLAGS value }
  db 66h           { xor eax,ecx }
  xor ax,cx        { can't toggle AC bit, CPU=Intel386 }
  mov ax, cpu386   { turn on 386 flag }
  je @@End_CpuType

  { i486 DX CPU / i487 SX MCP and i486 SX CPU checking }
  { Checking for ability to set/clear ID flag (Bit 21) in EFLAGS }
  { which indicates the presence of a processor }
  { with the ability to use the CPUID instruction. }
  db 66h           { pushfd }
  pushf            { push original EFLAGS }
  db 66h           { pop eax }
  pop ax           { get original EFLAGS in eax }
  db 66h           { mov ecx, eax }
  mov cx,ax        { save original EFLAGS in ecx }
  db 66h           { xor eax,200000h }
  xor ax,0h        { flip ID bit in EFLAGS }
  dw 0020h
  db 66h           { push eax }
  push ax          { save for EFLAGS }
  db 66h           { popfd }
  popf             { copy to EFLAGS }
  db 66h           { pushfd }
  pushf            { push EFLAGS }
  db 66h           { pop eax }
  pop ax           { get new EFLAGS value }
  db 66h           { xor eax, ecx }
  xor ax, cx
  mov ax, cpu486   { turn on i486 flag }
  je @@End_CpuType { if ID bit cannot be changed, CPU=486}
                   { without CPUID instruction functionality }

  { Execute CPUID instruction to determine vendor, family, }
  { model and stepping.  The use of the CPUID instruction used }
  { in this program can be used for B0 and later steppings }
  { of the P5 processor. }
   db 66h          { mov eax, 1 }
   mov ax, 1       { set up for CPUID instruction }
   dw 0
   db 66h          { cpuid }
   db 0Fh          { Hardcoded opcode for CPUID instruction }
   db 0a2h
   db 66h          { and eax, 0F00H }
   and ax, 0F00H   { mask everything but family }
   dw 0
   db 66h          { shr eax, 8 }
   shr ax, 8       { shift the cpu type down to the low byte }
   sub ax, 1       { subtract 1 to map to TCpuType }

@@End_CpuType:
   pop ds
end;

function CpuTypeString: String;
var
  kind: TCpuType;
begin
  kind := CpuType;
  case kind of
  cpu8086:
    Result := '8086';
  cpu80286:
    Result := '80286';
  cpu386:
    Result := '386';
  cpu486:
    Result := '486';
  cpuPentium:
    Result := 'Pentium';
  else
    { Try to be flexible for future cpu types, e.g., P6. }
    Result := Format('P%d', [Ord(kind)]);
  end;
end;

end.





491   [일반/컴포넌트] TRichEdit 의 선택된 영역만 인쇄하기  김영대 2003/03/07 4491 727
  [시스템] CPU 종류 구하기  김영대 2003/03/07 4811 1195
489   [시스템] 사운드파일 없이 PC 스피커로 음악연주  김영대 2003/03/07 4654 924
488   [네트웍/인터넷] 프로그램으로 네트워크 드라이브 연결/해제  김영대 2003/03/07 6732 1252
487   [일반/컴포넌트] 윈도우즈 종료와 같은 그늘진 화면 만들기  김영대 2003/03/07 3145 841
486   [일반/컴포넌트] 아이콘 사이트  김영대 2003/03/07 3620 1067
485   [시스템] 윈도우즈 시스템 표준 폰트 구하기  김영대 2003/03/07 3025 851
484   [네트웍/인터넷] RS232 통신  김영대 2003/03/07 6932 1856
483   [일반/컴포넌트] 주어진 영역의 화면 캡처  김영대 2003/03/07 3564 1008
482   [일반/컴포넌트] 숫자를 영문 표기로 바꾸기  김영대 2003/03/07 4251 891
481   [일반/컴포넌트] 숫자를 한글 표기로 바꾸기  김영대 2003/03/07 3615 928
480   [일반/컴포넌트] RichEdit 의 내용을 Bitmap 으로 만들기 2  김영대 2003/03/07 3784 982
479   [COM/OLE] MS-WORD 종료시키기  김영대 2003/03/07 2670 747
478   [윈도우즈 API] 시스템 사운드 연주하기  김영대 2003/03/07 4797 1297
477   [일반/컴포넌트] Algorithm to sort a TStringGrid #2  김영대 2003/03/07 4774 1204
476   [윈도우즈 API] 외부 프로그램의 좌표,상태 구하기  김영대 2003/03/07 3168 1017
475   [윈도우즈 API] 윈도우즈 Telnet 으로 호스트 접속하기  김영대 2003/03/07 4069 1117
474   [일반/컴포넌트] 특정한 폴더로 이동한 DOS 창 띄우기  김영대 2003/03/07 4111 1134
473   [시스템] DOS 명령어 실행하고 결과 받아오기  김영대 2003/03/07 6546 1549
472   [윈도우즈 API] NT의 현재 user가 administrative privilege 를 가지고 있는지?  김영대 2003/03/07 2989 813
471   [일반/컴포넌트] 두개의 StringGrid sync 마추기  김영대 2003/03/07 3708 1017
470   [일반/컴포넌트] 윈도우의 title bar 폰트 바꾸기  김영대 2003/03/07 3231 841
469   [네트웍/인터넷] 네트워크 공유 설정/해제 하기 (Windows 9x)  김영대 2003/03/07 4396 1078
468   [네트웍/인터넷] 네트워크 공유 정보 읽어오기 (WIndows 9x)  김영대 2003/03/07 3655 993
467   [일반/컴포넌트] 눌려진 키보드 키의 명칭 구하기  김영대 2003/03/07 7377 1437
466   [윈도우즈 API] Windows98 에서의 SetForegroundWindow  김영대 2003/03/07 5743 1489
465   [윈도우즈 API] Task bar 에 나타나지 않는 프로그램 만들기  김영대 2003/03/07 5156 1509
464   [COM/OLE] Outlook 사용하기  김영대 2003/03/07 3475 1090
463   [시스템] 지정한 drive가 CD-ROM 인지 검사하기  김영대 2003/03/07 6289 1649
462   [시스템] 어떤 어플리케이션이 시작 되는지 hook으로 알아내기  김영대 2003/03/07 5125 1523
461   [윈도우즈 API] 윈도우즈 탐색기의 아이콘 뽑아내서 사용하기  김영대 2003/03/07 8034 1888
460   [윈도우즈 API] System Images  김영대 2003/03/07 6314 1828
459   [윈도우즈 API] 컴퓨터/파일/폴더 찾기 화면 띄우기  김영대 2003/03/07 6169 1471
458   [일반/컴포넌트] Unix-format time 을 TDateTime 로 바꾸기  김영대 2003/03/07 4100 1122
457   [일반/컴포넌트] 실행시 component 를 Move/Resize 시키기  김영대 2003/03/07 3312 952
456   [일반/컴포넌트] TMemo 를 화면크기로 인쇄하기  김영대 2003/03/07 2776 697
455   [일반/컴포넌트] SpeedButton 에 OnMouseEnter/OnMouseExit 이벤트 넣기  김영대 2003/03/07 3952 1041
454   [윈도우즈 API] 키보드의 Scroll Lock 켜기/끄기  김영대 2003/03/07 4176 1135
453   [데이터베이스] table packing 하기  김영대 2003/03/07 3479 1005
452   [윈도우즈 API] reboot Windows  김영대 2003/03/07 3882 1120

[이전 10개] [1]..[11][12] 13 [14][15][16][17][18][19][20]..[25] [다음 10개]
 

Copyright 1999-2022 Zeroboard / skin by zero