Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пауза через RDTSC, нужен простой пример 
:(
    Опции темы
Ruterian
Дата 15.2.2005, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 9.1.2004
Где: Вязьма, Минск

Репутация: нет
Всего: нет



Если у кого есть готовый пример кода, формирующего паузу через RDTSC на чистом ASM - киньте пожалуйста.
PM MAIL WWW ICQ   Вверх
oleg1973
Дата 18.2.2005, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: нет
Всего: 34



интересно как это?
это же счетчик тактов цпу

или тебе надо отследить паузу в тактах?
тогда проше подобрать эту паузу из комманд

вот идея пришла в голову
если читать с какого нить порта? таймер 0х40 к примеру (если не ошибаюсь номером)
в таком случае будет 100% задержка скажем в 5 мск и она будет думаю стандартной для всех мамок

а вот скорость выполнения команд цпу разная в зависимости от проца


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
Ruterian
Дата 19.2.2005, 02:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 9.1.2004
Где: Вязьма, Минск

Репутация: нет
Всего: нет



oleg1973

> интересно как это?
> это же счетчик тактов цпу

Ага, и по нему можно легко узнать тактовую частоту процессора. Например, измерив число тактов за 1 сек. по часам smile Эту частоту мы запоминаем в ячейке памяти программы при старте, и храним там все время.

Далее - становится известно, сколько тактов нужно отсчитать для нужного нам интервала. Хоть 1 мс, хоть 100... что мы и делаем в процедуре паузы.
PM MAIL WWW ICQ   Вверх
oleg1973
Дата 19.2.2005, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: нет
Всего: 34



Код

rdtsc
push  eax
invoke Sleep,1000
rdtsc
pop  ebx
sub  eax, ebx

в eax получаем такты за 1 секунду


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
Ruterian
Дата 20.2.2005, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 9.1.2004
Где: Вязьма, Минск

Репутация: нет
Всего: нет



Вот, сделал макет, вроде он работает. Выкладываю на обозрение, мож кто подскажет возможные грабли в этом алгоритме.

Код

;=================== Пауза 1 мс =======================
pause:
pushad

mov ecx,[freq]; загружаем нужное число тиков RDTSC для обработки
; Вычислить опасную границу счетчика
mov ebx,0ffffffffh
sub ebx,ecx; Т.к. пауза = 1 мс, то отнимаем частоту CPU в килогерцах (период 1мс) это от максимального значения

warn_bord:
RDTSC; Получаем текущее значение
cmp eax,ebx; сравнить текущее RDTSC с опасной границей
dec ecx; вычесть уже отмеряное циклом из нужного для 1 мс числа тиков
jae warn_bord; если больше - зациклить во избежании перехода через 0

mov ebx,eax; загрузить начальное значение RDTSC

; Ожидать в течение ecx тиков (ecx = freq минус уже пройденые тики)
add ebx,ecx; получить конечное значение счетчика
tp:                            
RDTSC; получить текущее значение счетчика
cmp eax,ebx; сравнить текущее и конечное значение
jb tp  ; пока текущее меньше - зациклить

popad
retn

freq dd 0; частота ЦПУ в килогерцах


Это сообщение отредактировал(а) Ruterian - 21.2.2005, 12:28
PM MAIL WWW ICQ   Вверх
Chingachguk
Дата 23.2.2005, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: 11
Всего: 18



Хотел заметить, что:

- Судя по командам, это код из win. Если так, то на уровне win32-приложения нельзя полагаться на то, что циклы не прервет переключение винды на другую задачу/ядро. В win98 хорошо работает обрамление cli/sti (да-да, на уровне user-кода !);

- Если это код не user-код под win, а, скажем, драйвер под win или dos, то есть возможность применения более мощных средств, например в винде на уровне ядра ДОЛЖНЫ БЫТЬ точные функции получения времени и уж наверняка можно привязаться к системному таймеру, который шлепает в win98 с периодом ~600 мкс (от него, кстати, получается GetTickCount), про дос вы сами все знаете;

- Если это user-код и, тем не менее, прямо необходимо иметь для него высокоточные задержки (раз уж нельзя никак разместить критичный код в драйвере !), то лучше опять таки писать драйвер, который будет "сверху" управлять поведением User-кода, например при начале задержки управление переходит в драйвер, который мониторит системное время и устанавливает некую глобальную (для user-кода) переменную по истечении тайм-аута (адрес ее передается в драйвер, но драйвер тут же отдает управление обратно).


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Ruterian
Дата 23.2.2005, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 9.1.2004
Где: Вязьма, Минск

Репутация: нет
Всего: нет



Chingachguk

Это код мультиплатформенного приложения (DOS / Win9x / NT).

В принципе, с небольшой погрешностью в NT я уже смирился, у "конкурентов" по аналогичному ПО такие же проблемы, кроме того они пишут на языках В.У. а там все гораздо более убого...
Пока мне нравится, как этот код работет в виртуальной DOS-машине XP, и его скорей всего, можно рекомендовать остальным программистам для
таких же задач. Но только что возникло пара вопросов:

1) Если вставить CLI/STI сюда:

Код

    cli
    mov ecx,[freq]
    mov ebx,0ffffffffh
    sub ebx,ecx

warn_bord:
    RDTSC
    cmp eax,ebx
    dec ecx
    jae warn_bord
    mov ebx,eax
    add ebx,ecx
tp:              
    RDTSC
    cmp eax,ebx
    jb tp
    sti


Будет ли от этого _реальная_ польза (повышение стабильности, точности итп) в Win 9х?

2) Заметил, что программа в полноэкранном ДОС-режиме под виндовс XP ведет себя странно - через секунд 20 замедляет работу, если нет нажатий на клавиши или "мышиной" активности (такой глюк имеется во всех аналогичных программах на языках в.у., но проявляется не всегда). Вопрос - можно ли как-нибудь "расшевеливать" её во время работы (может вызовом какого-нибуть прерывания?), чтобы не держать вручную <CTRL>? smile

PM MAIL WWW ICQ   Вверх
Chingachguk
Дата 23.2.2005, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: 11
Всего: 18



1) Вот что я наблюдал в win98. При засечеке времени выполнения кода одного брутфорса, один вариант которого выполнялся примерно за 40 мкс на P 120МГц я использовал следующую методику: циклил тело брутфорса на 100 выполнений, тем самым доводя время измерения до 100 x 40 мкс = 4 мс, а эти самые 4 мс измерял при помощи Soft-Ice (он не умеет мерять время точнее чем ~60 мкс). Если я использовал код без обрамления cli+sti, то время исполнения плавало в пределах 100% от величины времени выполнения, те примерно от 2 мс до 8 мс в моем случае. Если же я использовал эту пару, то измерение было неизменно стабильным. Как это скажется на стабильности системы (будут ли корректно идти системные часы к примеру) я не изучал, но однозначно cli с уровня 3 привилегий не должно помешать вызову таймера уровня ядра.

2) Насчет вызова int не знаю, попробуй швырять в буфер клавиатуры какой-нить символ (см. функции int 16h). А еще можно посмотреть в настройке задачи - вроде как в XP этим увлекаются - типа какой-нить галочки "всегда активна" и т.п.

PS Кстати, rdtsc возвращает 64-х битное значение счетчика команд в edx:eax.


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Ruterian
Дата 23.2.2005, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 9.1.2004
Где: Вязьма, Минск

Репутация: нет
Всего: нет



Chingachguk

Спасибо, буду пробовать с CLI

64 битный счетчик RDRSC, естественно. Но мне показалось, что очень неудобно оперировать структурами "пара регистров -> QWORD" в памяти и обменом между QWORD'ами. Вышестоящий пример сделан полностью на регистрах, имеет маленький код. Может быть я ошибаюсь и можно сделать более изящно на 64-битных переменных???
PM MAIL WWW ICQ   Вверх
nazyura
Дата 25.2.2005, 13:05 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Сергей!

Я бы сделал маненько по другому:
(не обращайте внимание на корректность - все условно)
=========
!!! Замеряем время выполнения самой процедуры !!!!!
GETPAUSE с вызовом PAUSE при МАКС/МИНИМ параметрах...
(В проге процедура всегда должна вызываться одинаково)
...
rdtsc
push eax
...
...

GETPAUSE:
.............................
mov ax,[maxcount] ;(mincount)
push ax
mov ax,[maxloops] ;(minloops)
push ax
mov ax,[maxtune] ;(TunePosition)=(mintune)(maxtune)
push ax
...
Call Pause
...
rdtsc
...
...
...Сохраняем полученные значения
выполнения процедуры....
Делим и присваиваем переменным:
[Мин]
[Сек]
...
...
[Мсек]
...
...
и.т.д. и.т.д.
.............................

Сама процедура может выглядеть примерно так:

Pause:
========PAUSE==========
...
...
mov cx,[count]
mov bx,[loop]
mov [massive+TunePosition],(opcode"JNE")

CNT:
===========
mov ax,0
cmp ax,1

[massive]
------------- Сдесь массив из кодов (по вкусу)
je EndTune
je EndTune
je EndTune
je EndTune
je EndTune
je EndTune
...
...
...
JNE EndTune В нужное место вставляем opcode"JNE" - для точной настройки задержки...
...
...
...
je EndTune
je EndTune
je EndTune
je EndTune
je EndTune
je EndTune
je EndTune
je EndTune
------------
EndTune:
===========
dec cx
cmp cx,0
jne cnt
dec bx
cmp bx,0
jne cnt
...
...
ret
=======================

Сумбурно все это, но смысл думаю вам понятен...
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0476 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.