zoukankan
html css js c++ java
Delphi7中插入汇编[Assembly]獲取CPUID
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TCPUID
=
array
[
1
..
4
]
of
Longint;
TVendor
=
array
[
0
..
11
]
of
char;
type
TForm1
=
class(TForm)
Edit1: TEdit;
Label1: TLabel;
Button1: TButton;
procedure
Button1Click(Sender: TObject);
private
{
Private declarations
}
public
{
Public declarations
}
end
;
const
ID_BIT
=
$
200000
;
//
CPU ID 專用變量 EFLAGS ID bit
var
Form1: TForm1;
FUNCTION IsCPUID_Available : BOOLEAN; register;
FUNCTION GetCPUID : TCPUID; assembler; register;
FUNCTION GetCPUVendor : TVendor; assembler; register;
implementation
{
$R *.dfm
}
//
CPU ID
==================================================
FUNCTION IsCPUID_Available : BOOLEAN; register;
asm
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 AL,TRUE
{
Result=TRUE
}
@exit:
END;
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;
//==============================================================================
procedure
TForm1.Button1Click(Sender: TObject);
var
cpuid:TCPUID; i:integer;
begin
if
IsCPUID_Available
then
begin
edit1.text:
=
''
;
cpuid:
=
GetCPUID;
//
CPUIDStr:
=
GetCPUVendor
+
'
_
'
;
for
i:
=
1
to
4
do
edit1.text:
=
edit1.text
+
IntToHex(CPUID[i],
4
);
end
else
edit1.text:
=
'
CPUID_IS_NOT_AVAILABLE
'
;
end
;
end
.
申明
非源创博文中的内容均收集自网上,若有侵权之处,请及时联络,我会在第一时间内删除.再次说声抱歉!!!
博文欢迎转载,但请给出原文连接。
查看全文
相关阅读:
MySQL 5.7.18 zip 文件安装过程
Mysql 自定义随机字符串
JAVA基本类型和引用类型
初识JSP
Java导出错误数据
时序图的使用习惯
Redis踩坑
ES踩坑
代码规范
Git在公司的使用流程
原文地址:https://www.cnblogs.com/Athrun/p/1239606.html
最新文章
Python相关包的安装
转载:稀疏编码
转载:深度学习caffe代码怎么读
转载:动作识别源码集合
转载:2013计算机视觉代码合集
coursera machine learning note
linear algebra review
deep learning入门学习
Linux常用命令-1
python接口测试http协议的get方法,参数为json
热门文章
java.util.logging.Logger使用详解
spring mvc :避免IE执行AJAX时,返回JSON出现下载文件
svn cleanup failed–previous operation has not finished; run cleanup if it was interrupted
bug级别分类
JAVA、android中常用的一些jar包的作用
hibernate 如何配置两个属性唯一
java的(PO,VO,TO,BO,DAO,POJO)解释
Spring知识点复习
Hibernate5.2之原生SQL查询
Hibernate5.2之HQL查询
Copyright © 2011-2022 走看看