:: MVP ::
|
|
:: RSS ::
|
|
|
Как определить версию CPUID?
function GetCPUID: Longint; assembler; register;
asm
mov eax, 1
dw $A20F {db $0F, $A2}
end;
procedure TForm1.Button1Click(Sender: TObject);
var
CPUID: Longint;
begin
CPUID := GetCPUID;
ShowMessage( IntToHex( CPUID, 8 ) );
end;
|
Как определить, доступен ли CPUID?
function IsCPUIDAvailable: boolean; assembler; register;
asm
pushfd
pop eax
mov edx, eax
xor eax, 200000h
push eax
popfd
pushfd
pop eax
xor eax,edx
jz @exit
mov al,true
@exit:
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if IsCPUIDAvailable then
Caption := 'Доступен'
else
Caption := 'Недоступен';
end;
|
Как узнать имя процессора?
uses
Registry;
function GetProcessorName: string;
var
Reg: TRegistry;
begin
Reg := TRegistry.Create;
Reg.RootKey := HKEY_LOCAL_MACHINE;
try
Reg.OpenKeyReadOnly( 'HARDWARE\DESCRIPTION\System\CentralProcessor\0' );
Result := Reg.ReadString( 'ProcessorNameString' );
finally
Reg.CloseKey;
Reg.Free;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage( GetProcessorName );
end;
|
Как отключить возбуждение исключений при выполнении операций в FPU?
uses
Math;
// При помощи настройки регистра "управляющее слово" (Control Word) можно
// отключить возбуждение исключений на ошибки при выполнение операций в FPU,
// "заставив" FPU возвращать значения NaN, +INF, -INF.
procedure TForm1.Button1Click(Sender: TObject);
var
CW: Word;
begin
CW := Get8087CW;
System.Set8087CW($133f); // Отключаем исключения
ShowMessage((1/0).ToString);
ShowMessage((-1/0).ToString);
ShowMessage((0/0).ToString);
ShowMessage((Infinity/Infinity).ToString);
System.Set8087CW(CW); // Восстанавливаем значение регистра
end;
|
Как очистить кэш команд процессора?
procedure HookFunction(const ATargetFunction, AHandler: Pointer);
const
MaxPossibleSize = 8;
var
OldProtectionCode: Cardinal;
begin
VirtualProtect(ATargetFunction, MaxPossibleSize, PAGE_READWRITE, @OldProtectionCode);
try
// какее-то действия, не имеющие значения для этой задачки
// PByte(@ATargetFunction)^ := $E9;
finally
VirtualProtect(ATargetFunction, MaxPossibleSize, OldProtectionCode, @OldProtectionCode);
FlushInstructionCache(GetCurrentProcess, ATargetFunction, SizeOf(DWORD){8}); // очистка кэша
end;
end;
|
При использовании материала - ссылка на сайт обязательна
|
|