随笔 - 171  文章 - 257  trackbacks - 0
<2006年1月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

常用链接

留言簿(33)

随笔分类(225)

随笔档案(171)

相册

技术

友情链接

最新随笔

搜索

  •  

积分与排名

  • 积分 - 440558
  • 排名 - 48

最新随笔

最新评论

阅读排行榜

评论排行榜

unit CPU;

interface

uses
  SysUtils;

type
  TCPUID = array[1..4] of Longint;
  TVendor = array[0..11] of char;

function GetCPUID: TCPUID; assembler; register;
function GetCPUVendor: TVendor; assembler; register;
function GetCPUInfo: string;

implementation


function GetCPUID: TCPUID; assembler; register;
asm
 PUSH    EBX         {Save affected register}
 PUSH    EDI
 MOV     EDI,EAX      {@Resukt}
 MOV     EAX,1
 DW      $A20F        {CPUID Command}
 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; 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;

function GetCPUInfo: string;
var
  CPUID: TCPUID;
  I: Integer;
  S: TVendor;
begin
  for I := Low(CPUID) to High(CPUID) do
    CPUID[I] := -1;

  CPUID := GetCPUID;

  S := GetCPUVendor;

  Result := S + IntToHex(CPUID[1], 8) + IntToHex(CPUID[2], 8)
    + IntToHex(CPUID[3], 8)
    + IntToHex(CPUID[4], 8);
end;


end.


以前中专d时候看ibm 8086/8088汇编有自己写过这些代码d,但是现在过了这么多年,退化到看不懂这些了
posted on 2006-01-12 09:56 Khan 阅读(973) 评论(0)  编辑 收藏 引用 所属分类: Delphi

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理