Форум: "Прочее";
Текущий архив: 2015.09.10;
Скачать: [xml.tar.bz2];
ВнизПротестируйте плз код на AMD Найти похожие ветки
← →
Rouse_ © (2014-11-10 11:02) [0]У кого есть амд-шые процессорты, протестите плз, а то не понятно как он работать будет.
program test;
{$APPTYPE CONSOLE}
{$R *.res}
uses
SysUtils;
type
TProcessorDescription = array [0..47] of AnsiChar;
function GetProcessorDescription: TProcessorDescription; assembler; register;
asm
push ebx
push edi
mov edi, eax
mov eax, $80000002
call @extract
mov eax, $80000003
call @extract
mov eax, $80000004
call @extract
jmp @end
@extract:
cpuid
stosd
mov eax, ebx
stosd
mov eax, ecx
stosd
mov eax, edx
stosd
ret
@end:
pop edi
pop ebx
end;
function TrimSpaces(Value: TProcessorDescription): string;
begin
Result := string(PAnsiChar(@Value[0]));
while Pos(" ", Result) > 0 do
Result := StringReplace(Result, " ", " ", [rfReplaceAll]);
Result := Trim(Result);
end;
begin
try
Writeln(TrimSpaces(GetProcessorDescription));
except
on E: Exception do
Writeln(E.ClassName, ": ", E.Message);
end;
Readln;
end.
← →
MBo © (2014-11-10 11:14) [1]Вот для двух:
AMD Phenom(tm) II X4 980 processor
AMD FX(tm) 8320 eight-core processor
← →
Rouse_ © (2014-11-10 11:22) [2]Отлично, спасибо :)
← →
MBo © (2014-11-10 11:26) [3]Из старых -
MD Athlon 64 3500+
← →
Dennis I. Komarov © (2014-11-10 15:36) [4]Сань, убить тебя за такой код)))
А коменты можно построчно?
← →
Rouse_ © (2014-11-10 15:53) [5]Каменты? Ну ща...
← →
Rouse_ © (2014-11-10 16:05) [6]Ну вот так:
program test;
{$APPTYPE CONSOLE}
{$R *.res}
uses
SysUtils;
type
// Буфер в котором возвращается результат (48 байт)
TProcessorDescription = array [0..47] of AnsiChar;
// функция возвращающая "Processor Brand String",
// которую можно получить вызвав инструкцию CPUID
// с параметрами (в EAX) $80000002, затем $80000003 затем $80000004
function GetProcessorDescription: TProcessorDescription; assembler; register;
asm
// сохраняем 2 регистра
push ebx
push edi
// адрес результирующего буфера размещаем в регистр EDI
// в него будут перемещатся данные вызовм STOSD
mov edi, eax
// инициализируем EAX первой константой
mov eax, $80000002
// получаем первую часть "Processor Brand String"
call @extract
// инициализируем EAX второй константой
mov eax, $80000003
// получаем вторую часть "Processor Brand String"
call @extract
// инициализируем EAX третьей константой
mov eax, $80000004
// получаем третью часть "Processor Brand String"
call @extract
// идем на выход
jmp @end
// проседура размещающая часть "Processor Brand String" в результирующем буфере
@extract:
// вызываем инструкцию CPUID, которая инициализирует регистры
// EAX, EBX, ECX, EDX символами одной из третей "Processor Brand String"
// к примеру на моей машине после вызова CPUID с параметром $80000002
// регистры примут следующий вид:
// EAX: 65746E49
// EBX: 2952286C
// ECX: 726F4320
// EDX: 4D542865
// если их перенести в результирующий буфер, посредством STOSD то получится такой массив байт
// $65, $74, $6E, $49, $29, $52, $28, $6C, $72, $6F, $43, $20, $4D, $54, $28, $65
// что будет означать (если представить как строку): "Intel(R) Core(TM"
cpuid
// переносим в результат содержимое EAX (EDI увеличится на 4 байта)
stosd
// переносим в результат содержимое EBX (EDI увеличится на 4 байта)
mov eax, ebx
stosd
// переносим в результат содержимое ECX (EDI увеличится на 4 байта)
mov eax, ecx
stosd
// переносим в результат содержимое EDX (EDI увеличится на 4 байта)
mov eax, edx
stosd
// завершаем вызов подпроцедуры
ret
@end:
// восстанавливаем значения регистров
pop edi
pop ebx
end;
function TrimSpaces(Value: TProcessorDescription): string;
begin
// убираем лишние пробелы
Result := string(PAnsiChar(@Value[0]));
while Pos(" ", Result) > 0 do
Result := StringReplace(Result, " ", " ", [rfReplaceAll]);
Result := Trim(Result);
end;
begin
try
Writeln(TrimSpaces(GetProcessorDescription));
except
on E: Exception do
Writeln(E.ClassName, ": ", E.Message);
end;
Readln;
end.
← →
Rouse_ © (2014-11-10 16:09) [7]Ну только буфер не такой немного, там байты в дворде наоборот идут, т.е.
не // $65, $74, $6E, $49, $29, $52, $28, $6C, $72, $6F, $43, $20, $4D, $54, $28, $65
а // $49, $6E, $74, $65 и т.д.
← →
Rouse_ © (2014-11-10 16:28) [8]Вот тебе по такому-же принципу вендор проца вытаскивается:
type
TVendor = array [0..11] of AnsiChar;
function GetProcessorVendorEx: TVendor; assembler; register;
asm
push ebx
push edi
mov edi, eax
mov eax, 0
cpuid
mov eax, ebx
stosd
mov eax, edx
stosd
mov eax, ecx
stosd
pop edi
pop ebx
end;
var
V: TVendor;
begin
try
V := GetProcessorVendorEx;
Writeln(PAnsiChar(@V[0]));
except
on E: Exception do
Writeln(E.ClassName, ": ", E.Message);
end;
Readln;
end.
← →
Dennis I. Komarov © (2014-11-10 16:29) [9]Пасиб! Не так все и страшно)
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2015.09.10;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.066 c