Garik66 Опубликовано 12 февраля, 2016 Поделиться Опубликовано 12 февраля, 2016 Мастера снова я к Вам. Допустим имеется инструкция inc eax Я хочу перед каждым выполнением этой инструкции, делать паузу с помощью Sleep. Делаю так: pushad push #3000 // 3 секунды. call Sleep popad inc eax но это приводит к замиранию всей игры на 3 сек. Как сделать паузу только для одной инструкции? 2 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 12 февраля, 2016 Автор Поделиться Опубликовано 12 февраля, 2016 Попробовал ещё несколько способов, но всё приводит либо к окончательному зависанию, либо к вылету из игры. Один из способов делает примерно тоже, что и в первом сообщении - создание цикла с ничего неделающим операндом, идея родилась при чтении этого: http://www.kolasc.net.ru/cdo/programmes/assembler/loop.html push ecx mov ecx,#1000000000 // около 1 сек jecxz @f cycl: nop loop cycl @@: pop ecx inc eax Этот способ приводит также к зависанию игры на 1 сек. Ссылка на комментарий Поделиться на другие сайты Поделиться
gmz Опубликовано 12 февраля, 2016 Поделиться Опубликовано 12 февраля, 2016 В 12.02.2016 в 19:05, Garik66 сказал: Этот способ приводит также к зависанию игры на 1 сек. Показать LOL тебе нужен асинхронный таймер: call GetTickCount64 cmp [TimeCheck],0 jnz @f mov [TimeCheck],eax @@: sub eax,[TimeCheck] cmp eax,2000 jb @f mov [TimeCheck],0 @@: 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 13 февраля, 2016 Автор Поделиться Опубликовано 13 февраля, 2016 (изменено) В 12.02.2016 в 21:21, gmz сказал: LOL тебе нужен асинхронный таймер: Показать А что тут смешного то? Ну твой способ это примерно тоже самое, что и мой второй способ, т.е. создание цикла и время паузы будет зависеть от частоты проца. Попробовал у себя вставил весь твой код, но тоже произошло зависание всей игры, а потом ещё и вылет. Так что не сработало. Короче, работают первый и второй способ, но нужно отделить инструкцию inc eax, от всего остального, чтобы пауза работала только с инструкцией inc eax. Попробовал добавить флаги-переключатели (несколько вариантов), но пока безрезультатно. Попробую ещё со вставкой на LUA, может поможет. Изменено 13 февраля, 2016 пользователем Garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
gmz Опубликовано 13 февраля, 2016 Поделиться Опубликовано 13 февраля, 2016 В 13.02.2016 в 07:48, Garik66 сказал: Ну твой способ это примерно тоже самое, что и мой второй способ, т.е. создание цикла и время паузы будет зависеть от частоты проца. Показать в каком месте ты видишь в моем коде цикл? имей в виду что eax ecx edx GetTickCount64 перетирает. попробуй вставить чисто мой код и смотри как каждые ~2сек в TimeCheck ставится 0 1 и 2 способы - бред. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 13 февраля, 2016 Автор Поделиться Опубликовано 13 февраля, 2016 (изменено) В 13.02.2016 в 09:12, gmz сказал: имей в виду что eax ecx edx GetTickCount64 перетирает. Показать gmz, а об этом нужно было сразу предупредить - я же не телепат, ( я уже тебе писал - спускайся с небес твоего уровня знаний на наш, давай информацию более подробно, если уже решил её дать). Поставил паши и попы, где нужно - вылетов из игры нет. Но, если вставить твой код вместо inc eax, то это просто приводит к замораживанию значения eax (т.е. проще занопить инструкцию). Если же вставить твой код перед inc eax. то eax продолжает увеличиваться как не в чём не бывало, как будто твоего кода и нет. Так что приведу лучше весь скрипт, думаю в твоём коде где-то ошибочка , проверь его пожалуйста. Показать контент [ENABLE] aobscan(aob_TimerMission,xx89xxxxxxxxc2xxxxxxxxxxxxxxxxxxxxxxxxxx8bxxxx85xx74xx8bxxxxxxxxxx8bxxffxxxxxxxxxx85) alloc(newmem_TimerMission,2048) label(returnhere_TimerMission) label(TimeCheck) registersymbol(aob_TimerMission) newmem_TimerMission: push eax push ecx push edx call GetTickCount64 pop edx pop ecx pop eax cmp [TimeCheck],0 jnz @f mov [TimeCheck],eax @@: sub eax,[TimeCheck] cmp eax,1000 jb @f mov [TimeCheck],0 @@: // inc eax mov [ecx+08],eax pop esi jmp returnhere_TimerMission TimeCheck: dd 0 aob_TimerMission: jmp newmem_TimerMission returnhere_TimerMission: [DISABLE] aob_TimerMission: db 40 89 41 08 5E unregistersymbol(aob_TimerMission) dealloc(newmem_TimerMission) Изменено 13 февраля, 2016 пользователем Garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
gmz Опубликовано 13 февраля, 2016 Поделиться Опубликовано 13 февраля, 2016 @f -> вперед прыг перед тем как юзать апи винды посмотрел бы как они реализ. xD вероятно так будет ОК: newmem_TimerMission: push eax push ecx push edx call GetTickCount64 cmp [TimeCheck],0 jnz @f mov [TimeCheck],eax @@: sub eax,[TimeCheck] cmp eax,1000 jb @f mov [TimeCheck],0 @@: pop edx pop ecx pop eax cmp [TimeCheck],0 jnz @f inc eax @@: mov [ecx+08],eax pop esi jmp returnhere_TimerMission 2 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 13 февраля, 2016 Автор Поделиться Опубликовано 13 февраля, 2016 В 13.02.2016 в 10:45, gmz сказал: @f -> вперед прыг Показать Да перепутал (b в jb меня запутало, я почему-то это увидел как jb @b), но моя ошибка не меняет дела - в коде у тебя всё равно цикл. Твой вариант сейчас попробую Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 13 февраля, 2016 Автор Поделиться Опубликовано 13 февраля, 2016 Так отлично заработало, gmz, ещё вопрос. Скольки секундам будет соответствовать, например cmp eax,1000? 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
gmz Опубликовано 13 февраля, 2016 Поделиться Опубликовано 13 февраля, 2016 В 13.02.2016 в 11:05, Garik66 сказал: в коде у тебя всё равно цикл Показать он не прыгает назад, все время вперед = не цикл lol иначе бы завис поток как в тех 1 и 2 вариантах.. В 13.02.2016 в 11:10, Garik66 сказал: Скольки секундам будет соответствовать, например cmp eax,1000? Показать ~1сек (если поток тормознет где то - будет больше) 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 13 февраля, 2016 Автор Поделиться Опубликовано 13 февраля, 2016 (изменено) В 13.02.2016 в 11:12, gmz сказал: он не прыгает назад, все время вперед = не цикл lol иначе бы завис поток как в тех 1 и 2 вариантах.. Показать Я это уже увидел, цикл в том что Inc eax не сработает пока eax не станет равным 1000 - а это всё равно цикл. В 13.02.2016 в 11:12, gmz сказал: ~1сек (если поток тормознет где то - будет больше) Показать По-видимому притормаживает, так как визуально в игре пауза около 3-х секунд. gmz, не смотря на все твои: В 12.02.2016 в 21:21, gmz сказал: LOL Показать и своеобразную подачу инфы - СПАСИБО тебе большое!!! - часто мне помогаешь. Результат выложил здесь: Изменено 13 февраля, 2016 пользователем Garik66 2 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 13 февраля, 2016 Автор Поделиться Опубликовано 13 февраля, 2016 (изменено) В 13.02.2016 в 09:12, gmz сказал: 1 и 2 способы - бред. Показать не бред , просто на СЕ Асссемблер не знаю как сделать это отдельным потоком. Вот в этом и просил помочь. Вот сейчас реализовал с помощью Sleep, но вставкой LUA, в ней автоматически идёт отдельным потоком и поэтому всё работает, как и задумывалось. Скрипт посмотри, если интересно, в теме: Работает на много точнее (ну и самого кода поменьше), предложенного тобой метода, т.е. Sleep "3000" точно соответствует ровно 3 сек задержки таймера. Изменено 13 февраля, 2016 пользователем Garik66 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения