Перейти к содержанию

Sleep для ассемблер СЕ.


Рекомендуемые сообщения

Мастера снова я к Вам.

Допустим имеется инструкция 

inc eax

Я хочу перед каждым выполнением этой инструкции, делать паузу с помощью Sleep.

Делаю так:

pushad
push #3000  // 3 секунды.
call Sleep
popad
inc eax

но это приводит к замиранию всей игры на 3 сек.

Как сделать паузу только для одной инструкции?

  • Плюс 2
Ссылка на комментарий
Поделиться на другие сайты

Попробовал ещё несколько способов, но всё приводит либо к окончательному зависанию, либо к вылету из игры.

Один из способов делает примерно тоже, что и в первом сообщении - создание цикла с ничего неделающим операндом, идея родилась при чтении этого:

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 сек.  

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, 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
Ссылка на комментарий
Поделиться на другие сайты

11 час назад, gmz сказал:

LOL тебе нужен асинхронный таймер:

А что тут смешного то?:P

 

Ну твой способ это примерно тоже самое, что и мой второй способ, т.е. создание цикла и время паузы будет зависеть от частоты проца.

Попробовал у себя вставил весь твой код, но тоже произошло зависание всей игры, а потом ещё и вылет.:wacko: Так что не сработало.

 

Короче, работают первый и второй способ, но нужно отделить инструкцию inc eax, от всего остального, чтобы пауза работала только с инструкцией inc eax.

Попробовал добавить флаги-переключатели (несколько вариантов), но пока безрезультатно. 

Попробую ещё со вставкой на LUA, может поможет.

 

Изменено пользователем Garik66
Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Garik66 сказал:

Ну твой способ это примерно тоже самое, что и мой второй способ, т.е. создание цикла и время паузы будет зависеть от частоты проца.

в каком месте ты видишь в моем коде цикл? :D

имей в виду что eax ecx edx GetTickCount64 перетирает. попробуй вставить чисто мой код и смотри как каждые ~2сек в TimeCheck ставится 0

1 и 2 способы - бред.

Ссылка на комментарий
Поделиться на другие сайты

 

1 час назад, gmz сказал:

имей в виду что eax ecx edx GetTickCount64 перетирает.

gmz, а об этом нужно было сразу предупредить - я же не телепат:P, ( я уже тебе писал - спускайся с небес твоего уровня знаний на наш, давай информацию более подробно, если уже решил её дать).

Поставил паши и попы, где нужно - вылетов из игры нет. :)

Но, если вставить твой код вместо inc eax, то это просто приводит к замораживанию значения eax (т.е. проще занопить инструкцию).

Если же вставить твой код перед inc eax. то eax продолжает увеличиваться как не в чём не бывало, как будто твоего кода и нет.

Так что приведу лучше весь скрипт, думаю в твоём коде где-то ошибочка :P, проверь его пожалуйста.

Скрытый текст

[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)

 

 

Изменено пользователем Garik66
Ссылка на комментарий
Поделиться на другие сайты

@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
Ссылка на комментарий
Поделиться на другие сайты

15 минуту назад, gmz сказал:

@f -> вперед прыг

Да перепутал (b в jb меня запутало, я почему-то это увидел как jb @b), но моя ошибка не меняет дела - в коде у тебя всё равно цикл.

 

Твой вариант сейчас попробую

Ссылка на комментарий
Поделиться на другие сайты

6 минут назад, Garik66 сказал:

в коде у тебя всё равно цикл

он не прыгает назад, все время вперед = не цикл lol иначе бы завис поток как в тех 1 и 2 вариантах..

 

1 минуту назад, Garik66 сказал:

Скольки секундам будет соответствовать, например cmp eax,1000?

~1сек (если поток тормознет где то - будет больше)

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

32 минуты назад, gmz сказал:

он не прыгает назад, все время вперед = не цикл lol иначе бы завис поток как в тех 1 и 2 вариантах..

Я это уже увидел, цикл в том что Inc eax не сработает пока eax не станет равным 1000 - а это всё равно цикл. ;)

32 минуты назад, gmz сказал:

~1сек (если поток тормознет где то - будет больше)

По-видимому притормаживает, так как визуально в игре пауза около 3-х секунд.

 

 

не смотря на все твои: 

14 часа назад, gmz сказал:

LOL

и своеобразную  подачу инфы - СПАСИБО тебе большое!!! - часто мне помогаешь. :)

 

Результат выложил здесь:

 

 

Изменено пользователем Garik66
  • Плюс 2
Ссылка на комментарий
Поделиться на другие сайты

5 часов назад, gmz сказал:

1 и 2 способы - бред.

не бред :P, просто на СЕ Асссемблер не знаю как сделать это отдельным потоком.:wacko: Вот в этом и просил помочь.

Вот сейчас реализовал с помощью Sleep, но вставкой LUA, в ней автоматически идёт отдельным потоком и поэтому всё работает, как и задумывалось. Скрипт посмотри, если интересно, в теме:

 

Работает на много точнее (ну и самого кода поменьше), предложенного тобой метода, т.е. Sleep "3000" точно соответствует ровно 3 сек задержки таймера.  

Изменено пользователем Garik66
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.