Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Разбор классических алгоритмов и олимпиадных задач. RDTSC


Информационный Канал Subscribe.Ru

От автора
 В этом выпуске я бы хотел описать использование счётчика тактов. Для глубокого понимания необходимы поверхностные знания ассемблера. С вопросами, предложениями, решениями и т.д. пишите на ferrik@mail.ru. В следующих выпусках хотелось бы разобраться с алгоритмами сортировки.

Теория

 В этом выпуске я расскажу, как можно замереть гораздо меньшие промежутки времени. Использовать мы будем инструкцию RDTSC, которая возвращает текущий счёт тактов в двух регистрах eax и edx.
asm
  RDTSC
end;
Если ваша версия Delphi не поддерживает данную инструкцию, то делать стоит так:
asm
   db $0F,$31
end;

Я советую написать функцию, возвращающую текущий счёт в переменную типа Int64. Я делаю это так (возможно не очень красиво):
type
  PInt64=^Int64;
...
procedure GetRDTSC(a:PInt64);
asm
  push esi
  mov esi,a
  db $0F,$31;
  mov [esi],eax
  mov [esi+4],edx
  pop esi
end;

Для примера я приведу код, который определяет тактовую частоту процессора. Попробуйте сами разобраться в нём, и если у Вас возникают вопросы, то пишите. Также, если частота вашего процессора не соответсвует указанной, то тоже пишите (интересно будет выделить такие случаи).
program RDTSC;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
PINT64=^Int64;
var
c1,c2 : PInt64;
procedure GetRDTSC(a:PInt64);
asm
push esi
mov esi,a
db $0F,$31;
mov [esi],eax
mov [esi+4],edx
pop esi
end;
begin
New(c1);
New(c2);
Sleep(100);
GetRDTSC(c1);
Sleep(1000);
GetRDTSC(C2);
writeln((c2^-c1^)/1000000:0:0,' Mhz');
Dispose(c1);
Dispose(c2);
readln;
end.


Задача
 Задача лёгкая. Свои решение можете присылать по указанному выше адресу (dpr файл должен быть заархивирован(ZIP) и добавлен к письму).
  Сосчитайте количество единиц в двоичной записи числа i (число i в десятичной системе счисления не длиннее 255 цифр). Во входном файле "input.txt" число i в десятичном представлении, а в выходном "output.txt" число единиц.

http://subscribe.ru/
http://subscribe.ru/feedback/
Адрес подписки
Отписаться

В избранное