Давно я что-то не касался (и не дотрагивался) темы ассемблера, пора исправить этот не большой баг. Сегодня поговорим о ассемблерной инструкции RDTSC. Собственно что это такое и зачем она нам нужна?Эта инструкция читает счётчик времени в процессоре(TSC) и возвращает 64-битный результат в регистры EDX:EAX количество тактов с момента последнего сброса процессора . Что это, мы поговорим немного позже. На этом функции rdtsc не заканчиваются. Так же она может применяться в антиотладочных приёмах и для генерации псевдослучайных чисел. Же она может работать с малыми временными интервалами.
Как собственно говоря работает RDTSC? Попробую попытаться объяснить.Она подсчитывает количество тактов начиная с включения, информация о количестве тактов записывается в регистры EDX:EAX. Старшие 32 бита MSR, загружаются в регистр EDX, а младшие 32 в EAX. До появления многоядерных процессоров(а так же с технологией Hyper-threaded) эта функция могла похвастаться точными результатами, но после их выхода, такого про неё уже сказать нельзя. Нет гарантии что счётчики со всех процессоров, будут синхронизированы, поэтому достоверные результаты можно было получить только с одного процессора. Но в современных решениях, Intel могут быть синхронизированы знания и на многоядерной системе. Также счётчик TSK, в таких системах, увеличивается на единицу вне зависимости от того, работал процессор или «спал». Раньше, если процессор переводился в спящий режим, счётчик TSC сбрасывался. Так же нельзя не заметить, что Microsoft не рекомендует использовать TSC для широкого временного разрешения. То есть много замерять нельзя. Вместо этого, корпорация предлагает заменить своими API-функциями. QueryPerformanceCounter и QueryPerformanceFrequency. Даже при использовании этого кода, Microsoft советует блокировать код на одном процессоре. Для Linux тоже самое можно повторить, если прочитать значение CLOCK_MONOTONIC функции clock_gettime.
Но теперь давайте перейдём непосредственно к примерам. Сначала будем используем TSC по его прямому назначению
Листинг 1.1
int clock;
_asm
{
RDTSC
MOV clock, eax
RDTSC
SUB clock,eax
}
cout << abs(clock);
Сначала читаем значение регистра времени, затем полученный результат перебрасываем в clock. Далее снова читаем rdtsc, и полученный снова результат, вычитаем из того что было.
И получим за сколько тактов выполняется этот код. У меня эта цифра была 63. Почему так много?Это уже тема для отдельного разговора.
Также и тоже можно получить если выполнив такой код:
Листинг 1.2
int clock;
_asm
{
RDTSC
MOV clock, EAX
RDTSC
SUB EAX, clock
}
Сначала очищается eax, далее вызывается функция cpuid(CPU Identection). Она используется для получения информации о процессоре. Но а дальше, код думаю должен быть понятен, потому что он уже был описан выше. Вот так советует поступать с RDTSC Intel.
А мы будем идти дальше и следующей нашей остановкой будет выяснение, как это можно применить при отладке. Всё довольно очевидно, если программу трассируют под отладчиком, то естественно количество тактов увеличивается. Поэтому ловим время которое буз отладчика, сравниваем его с текущим и если больше, значит отладчик есть.
Листинг 1.4
int clock;
_asm
{
RDTSC
MOV clock, eax
RDTSC
SUB clock,eax
}
if(clock > 63)
MessageBox(NULL,"Отладчик есть","Попался!",MB_OK);
else
MessageBox(NULL,"Отладчика нет","всё норм",MB_OK);
Как видно, мы просто дополнили слегка пример 1. И теперь если пройтись отладчиком поэтому месту, то появится табличка «Отладчик есть». Но примером в чистом таком виде, вряд ли сможет поймать кого-то его надо модифицировать, но это другая история.
И наконец, самое простое, что можно сделать с этой функцией. Это генератор псевдослучайных чисел. Что это такое, говорить не буду, потому что итак думаю ясно, а лучше перейду к примеру.
Листинг 1.5
int mm;
_asm
{
RDTSC
MOV mm, eax
}
cout << abs(mm);
Тут мы просто читаем из регистра EAX и отбрасываем минус, если он есть. Вот и готов генератор. Если надо число меньше, то просто делим на 10 или на 100 итд.
Мы сегодня разобрали функцию Rdtsc, что само по себе являлось очень интересным занятием. Конечно, это не все свойства этой замечательной функции, но на основных моментах, мы остановились. Удачи и успехов!
Промто !
Сегодня по Спорту будет трансляции Матчи Уефа – Не пропустите ! Играют Центральный Спортивный Клуб Армии и Спартак.
ЛОЛ.…
Н орм…
Добрый день! luke@grantmaro.ru» rel=»nofollow»>……
С уважением,…
Хорошего Вам дня! ian@elektrashop.ru» rel=»nofollow»>……
с ув….
Добрый день! thomas@sotkashop.ru» rel=»nofollow»>……
С уважением,…
Добрый день! jose@tehnon.ru» rel=»nofollow»>……
с ув….
Buy:Zithromax.Viagra Soft Tabs.Cialis.Viagra Super Force.VPXL.Maxaman.Tramadol.Super Active ED Pack.Soma.Cialis Soft Tabs.Viagra.Propecia.Cialis Super Active+.Viagra Professional.Viagra Super Active+.Levitra.Cialis Professional….
Victorian http://drembrandthfnhs.05KIAPARTS.US/tag/caravaggio+bridge+Victorian/ : bridge…
bridge…