![]() |
|
|
![]()
|
|
| Ruterian |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 9.1.2004 Где: Вязьма, Минск Репутация: нет Всего: нет |
Если у кого есть готовый пример кода, формирующего паузу через RDTSC на чистом ASM - киньте пожалуйста.
|
|||
|
||||
| oleg1973 |
|
|||
![]() asm fanat ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: нет Всего: 34 |
интересно как это?
это же счетчик тактов цпу или тебе надо отследить паузу в тактах? тогда проше подобрать эту паузу из комманд вот идея пришла в голову если читать с какого нить порта? таймер 0х40 к примеру (если не ошибаюсь номером) в таком случае будет 100% задержка скажем в 5 мск и она будет думаю стандартной для всех мамок а вот скорость выполнения команд цпу разная в зависимости от проца -------------------- SST 465555 icq 200-512-712 |
|||
|
||||
| Ruterian |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 9.1.2004 Где: Вязьма, Минск Репутация: нет Всего: нет |
oleg1973
> интересно как это? > это же счетчик тактов цпу Ага, и по нему можно легко узнать тактовую частоту процессора. Например, измерив число тактов за 1 сек. по часам Далее - становится известно, сколько тактов нужно отсчитать для нужного нам интервала. Хоть 1 мс, хоть 100... что мы и делаем в процедуре паузы. |
|||
|
||||
| oleg1973 |
|
|||
![]() asm fanat ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: нет Всего: 34 |
в eax получаем такты за 1 секунду -------------------- SST 465555 icq 200-512-712 |
|||
|
||||
| Ruterian |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 9.1.2004 Где: Вязьма, Минск Репутация: нет Всего: нет |
Вот, сделал макет, вроде он работает. Выкладываю на обозрение, мож кто подскажет возможные грабли в этом алгоритме.
Это сообщение отредактировал(а) Ruterian - 21.2.2005, 12:28 |
|||
|
||||
| Chingachguk |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 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. |
|||
|
||||
| Ruterian |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 9.1.2004 Где: Вязьма, Минск Репутация: нет Всего: нет |
Chingachguk
Это код мультиплатформенного приложения (DOS / Win9x / NT). В принципе, с небольшой погрешностью в NT я уже смирился, у "конкурентов" по аналогичному ПО такие же проблемы, кроме того они пишут на языках В.У. а там все гораздо более убого... Пока мне нравится, как этот код работет в виртуальной DOS-машине XP, и его скорей всего, можно рекомендовать остальным программистам для таких же задач. Но только что возникло пара вопросов: 1) Если вставить CLI/STI сюда:
Будет ли от этого _реальная_ польза (повышение стабильности, точности итп) в Win 9х? 2) Заметил, что программа в полноэкранном ДОС-режиме под виндовс XP ведет себя странно - через секунд 20 замедляет работу, если нет нажатий на клавиши или "мышиной" активности (такой глюк имеется во всех аналогичных программах на языках в.у., но проявляется не всегда). Вопрос - можно ли как-нибудь "расшевеливать" её во время работы (может вызовом какого-нибуть прерывания?), чтобы не держать вручную <CTRL>? |
|||
|
||||
| Chingachguk |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 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. |
|||
|
||||
| Ruterian |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 9.1.2004 Где: Вязьма, Минск Репутация: нет Всего: нет |
Chingachguk
Спасибо, буду пробовать с CLI 64 битный счетчик RDRSC, естественно. Но мне показалось, что очень неудобно оперировать структурами "пара регистров -> QWORD" в памяти и обменом между QWORD'ами. Вышестоящий пример сделан полностью на регистрах, имеет маленький код. Может быть я ошибаюсь и можно сделать более изящно на 64-битных переменных??? |
|||
|
||||
| nazyura |
|
|||
|
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. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Asm для начинающих | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |