fasm цикл

Тема в разделе "WASM.BEGINNERS", создана пользователем e4key, 18 сен 2009.

  1. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    как организовать цикл, например с 5 повторами? почитал про loop - то что нужно, но не работает у меня =/

    написал следующее:

    Код (Text):
    1. format PE GUI 4.0
    2. entry main
    3.  
    4. include 'win32a.inc'
    5.  
    6. section '.data' data readable writeable
    7.   hello         db 'hello', 0
    8.  
    9. section '.code' code readable executable
    10.   main:
    11.         mov     ecx, 5
    12.  
    13.         hehe:
    14.                 invoke  MessageBox, 0, hello, hello, MB_OK
    15.                 loop    hehe
    16.  
    17.         invoke  ExitProcess, 0
    18.  
    19. section '.idata' import data readable writeable
    20.   library kernel32, 'kernel32.dll',\
    21.           user32, 'user32.dll'
    22.  
    23.  
    24.   include 'api\kernel32.inc'
    25.   include 'api\user32.inc'
    но сообщение показывается далеко не 5 раз :) посмотрел в олли - ecx нормально присваивается 5, но при первом показе сообщения ecx каким то чудом принимает значение 30000 =/ Где ошибка? спасибо :)
     
  2. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    Попробовал просто запустить msgbox без всяких циклов - ecx и правда принимает значение 30к =/ как быть?
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    e4key
    http://wasm.ru/forum/viewtopic.php?pid=296155#p296155

    Используем локальную переменную для счётчика, регистр Ebx, Esi, Edi, либо перед вызовом апи сохраняем в стеке Ecx, а после возврата извлекаем его.
     
  4. e4key

    e4key New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2009
    Сообщения:
    101
    Спасибо, Clerk.

    А какой вообще тогда толк в win32 от loop'a, если приходится каждый раз класть ecx в стек и затем брать его от туда? В таком случае уж лучше наверное с dec + jnz :)
     
  5. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    да. и быстрее к тому же
     
  6. ntdll

    ntdll New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2009
    Сообщения:
    16
    loop короче, а в циклах не всегда api вызываются
     
  7. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.787
    Код (Text):
    1. mov     ecx, 5
    2.         hehe: push ecx
    3.                 invoke  MessageBox, 0, hello, hello, MB_OK
    4.                 pop ecx
    5.                 loop    hehe
    В том случае если в качестве счетчика используется содержимое ebx, edi, esi, ebp, esp можно
    Код (Text):
    1.         mov edi,5
    2.         hehe: invoke  MessageBox, 0, hello, hello, MB_OK
    3.                 dec edi
    4.                 jnz    hehe
    кроме того -- если требуется несколько вложенных циклов, то "приходится каждый раз класть ecx в стек и затем брать его от туда"