Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.05 c
15-1421247484
Дмитрий С
2015-01-14 17:58
2015.09.10
Круговая диаграмма


2-1393479979
Васька
2014-02-27 09:46
2015.09.10
Переключение между дочерними окнами


2-1392456356
lewka
2014-02-15 13:25
2015.09.10
помогите с запросом в SQL, пожалуйста


11-1259909126
MTsv DN
2009-12-04 09:45
2015.09.10
Работа с меню...


2-1397634920
lewka_s
2014-04-16 11:55
2015.09.10
Список баз данных





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский