Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2015.09.10;
Скачать: CL | DM;

Вниз

Протестируйте плз код на 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.058 c
15-1419370202
Юрий
2014-12-24 00:30
2015.09.10
С днем рождения ! 24 декабря 2014 среда


15-1414960402
dmk
2014-11-02 23:33
2015.09.10
Слетает платформа


15-1418160605
Юрий
2014-12-10 00:30
2015.09.10
С днем рождения ! 10 декабря 2014 среда


15-1418396465
Gydvin
2014-12-12 18:01
2015.09.10
А вот интересно


15-1414870399
Pavia
2014-11-01 22:33
2015.09.10
Переопределение класса.