Как сделать...

Тема в разделе "WASM.BEGINNERS", создана пользователем HPC, 8 июн 2011.

  1. HPC

    HPC New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2011
    Сообщения:
    37
    Всем привет.
    Ниже есть небольшой код,Таймер+Мессадж.
    Есть один вопрос.
    Как сделать вызов функции "Sleep" три раза подряд,со значениями time1,time2 ,time3 и прыгнуть на Мессадж?

    Только сделать не так:

    push time1
    call [Sleep]

    push time2
    call [Sleep]

    push time3
    call [Sleep]


    ----------------------------------------------------------------
    Код (Text):
    1. format PE GUI 4.0
    2. entry start
    3. include 'win32a.inc'
    4.  
    5. start:
    6.  
    7. mov ebx,[time1]
    8.  
    9. push ebx
    10. call   [Sleep]
    11.  
    12.  
    13. push 0
    14. push text
    15. push text
    16. push 0
    17. call [MessageBoxA]
    18.  
    19. ret
    20.  
    21. time1   dd 1000
    22. time2   dd 2000
    23. time3   dd 3000
    24.  
    25.  
    26. text db 'test',0
    27.  
    28.      
    29. section '.idata' import data readable writeable
    30.  library kernel32,'KERNEL32.DLL',\
    31.           user32,'USER32.DLL'
    32.          
    33.   include 'api/kernel32.inc'
    34.   include 'api/user32.inc'
    Нужно както сделать чтоб напрммер

    считали в ebx time1
    вызвали Sleep
    вернулись ,считали в ebx time2
    вызвали Sleep
    вернулись....
    И после вызова time3 прыгнуть на Мессадж
    Можно так какнибудь сделать?
     
  2. pashe4ka13

    pashe4ka13 New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2010
    Сообщения:
    263
    Я не совсем понял как Вы и что хотите? Может вам надо макрос invoke?
    Код (Text):
    1. format PE GUI 4.0
    2. entry start
    3. include 'F:\fasm\INCLUDE\win32ax.inc'
    4. section '.data' data readable writable
    5. time1   dd 1000
    6. time2   dd 2000
    7. time3   dd 3000
    8.  
    9. section '.code' code readable executable ;ñåêöèÿ êîäà
    10. proc start
    11.         invoke Sleep,[time1]
    12.         invoke Sleep,[time2]
    13.         invoke Sleep,[time3]
    14.         invoke MessageBox,0,'text','text',MB_OK ;âûâîäèì ðåçóëüòàò íà ýêðàí
    15.         invoke ExitProcess,0
    16. endp
    17. section '.idata' import data readable writeable
    18.   library kernel32,'KERNEL32.DLL',\
    19.           user32,'USER32.DLL'
    20. include 'F:\fasm\INCLUDE\api\kernel32.inc'
    21. include 'F:\fasm\INCLUDE\api\user32.inc'
     
  3. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    HPC
    К ebx привязываться ненадо.
    Опишите проблему нормально.
     
  4. HPC

    HPC New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2011
    Сообщения:
    37
    Ок,попробую объяснить так.
    Допустим что мне необходимо вызвать 20 раз подряд одну и туже функцию с разными параметрами.В качестве примера возьмем "Sleep" .

    Можно так:

    invoke Sleep,[time1]
    invoke Sleep,[time2]
    .... .... ..... ..... ..
    ... ... ... ... ... .....
    invoke Sleep,[time10]
    .... ....... .............
    ... .............. ...........
    invoke Sleep,[time20]

    invoke MessageBox,0,'text','text',MB_OK

    Вот.Нечего сложного бери и пиши 20 раз invoke Sleep.

    А можно сделать чтоб в коде было так

    .. .. .. ..
    invoke Sleep,[параметр]

    invoke MessageBox,0,'text','text',MB_OK


    чтоб небыло 20 строк "invoke Sleep" а менялся только [параметр] ???
     
  5. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    HPC
    Код (Text):
    1. section 'DATA' data readable writable
    2. time_queue:
    3. time1   dd 1000
    4. time2   dd 2000
    5. time3   dd 3000
    6. ...
    7. time20 dd FFFF
    8.  
    9. section 'CODE' code readable executable
    10. proc start
    11. push ecx
    12. mov ecx,20d
    13. push esi,offset time_queue
    14. next_sleep:
    15. invoke Sleep, [esi]
    16. add esi,4
    17. loopd short next_sleep
    18. pop esi
    19. pop ecx
    20. invoke MessageBox,0,'Sleep result','All done!',MB_OK
    21. invoke ExitProcess,0
    22. endp
     
  6. pashe4ka13

    pashe4ka13 New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2010
    Сообщения:
    263
    немного подредактировал код NoName, а то у меня такое чувство, что у него половина на MASM написана :)
    Код (Text):
    1. include 'F:\fasm\INCLUDE\win32ax.inc'
    2. section '.data' data readable writable
    3. time_queue:
    4. time1   dd 100
    5. time2   dd 200
    6. time3   dd 300
    7.  
    8. section 'CODE' code readable executable
    9. proc start
    10. mov ecx,2
    11. lea esi,[time_queue]
    12. next_sleep:
    13. push ecx
    14. invoke Sleep,dword [esi]
    15. add esi,4
    16. pop ecx
    17. loopd short next_sleep
    18. invoke MessageBox,0,'Sleep result','All done!',MB_OK
    19. invoke ExitProcess,0
    20. endp
    21. section '.idata' import data readable writeable
    22.   library kernel32,'KERNEL32.DLL',\
    23.           user32,'USER32.DLL'
    24. include 'F:\fasm\INCLUDE\api\kernel32.inc'
    25. include 'F:\fasm\INCLUDE\api\user32.inc'
     
  7. HPC

    HPC New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2011
    Сообщения:
    37
    Угу)ошибочку выдовало.
    Всё теперь ясно как это делается.
    Спасибо большое NoName и pashe4ka13 .
     
  8. pashe4ka13

    pashe4ka13 New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2010
    Сообщения:
    263
    HPC
    Это можно сделать и другими способами, читай про циклы и команды условных переходов. Кстати у меня там тоже ошибка
    Код (Text):
    1. mov ecx,2  <---должно быть 3, а то цикл выполнится два раза и не будет выполнено Sleep(time3);
     
  9. HPC

    HPC New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2011
    Сообщения:
    37
    Хорошо почитаю обезательно.

    По поводу
    Код (Text):
    1. mov ecx,2
    я уже разобрался.
    Спасиб еще раз.
     
  10. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    Итак где описание прблемы ?