小弟在论坛上粘贴了一段代码,用来得到CPU码,如下声明:
R :array[0..19] of Char;
CpuID :Integer;
内容: FillChar(R, 20, 0);
asm
mov eax, 0
db 0fh, 0a2h
mov dword ptr R[0], ebx
mov dword ptr R[4], edx
mov dword ptr R[8], ecx
mov eax, 1
db 0fh, 0a2h
mov CpuID, edx end;但总是出现“Access violation at address...”的错误,怎么解决呢??
R :array[0..19] of Char;
CpuID :Integer;
内容: FillChar(R, 20, 0);
asm
mov eax, 0
db 0fh, 0a2h
mov dword ptr R[0], ebx
mov dword ptr R[4], edx
mov dword ptr R[8], ecx
mov eax, 1
db 0fh, 0a2h
mov CpuID, edx end;但总是出现“Access violation at address...”的错误,怎么解决呢??
语句1
语句2
语句3
语句4
语句5
语句6
finally
//啥也不做
end;
如果“语句3”出现问题,跳到finally中,然后还会跳回“语句4”吗?????
//------------------------------------------------------------------------------
// //获取CPU ID 和 CPU Vendor
//------------------------------------------------------------------------------
//获取CPU ID 和 CPU Vendor
type
TCPUID = array[1..4] of Longint;
TVendor = array [0..11] of char;
function GetCpuIDx : 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 GetCPUVendorx : 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;
//-------------------------
(*得到CPUID*)
Function TFun.GetCPUID:string;
var
CPUID : TCPUID;
I : Integer;
begin
for I := Low(CPUID) to High(CPUID) do CPUID[I] := -1;
CPUID := GetCPUIDx;
result:= IntToStr(CPUID[1])+IntToStr(CPUID[2])+IntToStr(CPUID[3])+IntToStr(CPUID[4]);
end;
//------------------------
(*的到CPUde Vendor,也就是判断CPU是AMD的还是INTER的*)
Function TFun.GetCPUVendor: string;
begin
result := GetCPUVendorx;
end;
语句1
语句N
finally
语句PPPPPPPP
end;
XXXXXXXXXXXXXX
如果语句1 出错就会执行到 语句PPPPPPPP,然后就向下执行XXXXXXXXXX
var
R: array[0..19] of Char;
CpuID: Integer;
begin
FillChar(R, 20, 0);
asm
mov eax, 0
db 0fh, 0a2h
mov dword ptr R[0], ebx
mov dword ptr R[4], edx
mov dword ptr R[8], ecx
mov eax, 1
db 0fh, 0a2h
mov CpuID, edx
end; ShowMessage( 'CPU制造商为: ' + R + #13#10#13#10 + '序列号为: ' + IntToStr(CpuID));
end;