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
.
申明
非源创博文中的内容均收集自网上,若有侵权之处,请及时联络,我会在第一时间内删除.再次说声抱歉!!!
博文欢迎转载,但请给出原文连接。
查看全文
相关阅读:
移动布局---1. 移动端布局基础
1. CSS新特性之选择器
1. H5新增语义化标签
POJ 3281
poj 1986
POJ 3728
poj 2763
poj 2749
uva 11294
LA 3713
原文地址:https://www.cnblogs.com/Athrun/p/1239606.html
最新文章
LeetCode-Reconstruct Itinerary
LeetCode-Largest BST Subtree
LeetCode-Longest Substring with At Most K Distinct Characters
序列化类型为XX的对象时检测到循环引用
Oracle ORA-00119和ORA-00132的解决方案
静态Web开发 JQuery
JS中图片的放大缩小没反应
用JS动态创建登录表单,报了个小错误
ODAC访问oracle时,提示:由于以前的函数求值超时,函数求值被禁用,必须继续执行才能正常返回
ODAC连接远程Oracle数据库时,数据源名称orcl改为gscloud
热门文章
静态Web开发 DOM
[转]javascript console 函数详解 js开发调试的利器
静态Web开发 JavaScript
移动布局---6. 移动端常见布局
java基础---1. 预备知识和开发环境和入门
移动布局---7. JD案例 _流式布局
移动布局---5. 移动端技术解决方案
移动布局---4. 移动端开发选择
移动布局---3. 二倍图
移动布局---2. 视口
Copyright © 2011-2022 走看看