Не работают циклы?!

Тема в разделе "WASM.BEGINNERS", создана пользователем kalexi, 12 мар 2011.

  1. kalexi

    kalexi New Member

    Публикаций:
    0
    Регистрация:
    11 сен 2007
    Сообщения:
    43
    Ничего не могу понять... Делаю цикл:

    Код (Text):
    1. proc GetOpType
    2.         mov   cx,3
    3. @@:
    4.         invoke  MessageBox,0,"","",0
    5.         loopw   @b
    6.         ret
    7. endp
    В результате получается бесконечный цикл. Даже если я использую схему "dec cx, jnz" происходит тоже самое. Подскажите пожалуйста.


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

    p.s.
    Вообще я думал изначально сделать массив с маркером окончания массива и в цикле ловить его...
     
  2. asmlamo

    asmlamo Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    1.742
    Делай так :

    mov ecx,3

    zzz:
    push ecx
    invoke MessageBox
    pop ecx

    loop zzz


    И погоняй в дебагере мож invoke MessageBox ecx портит.
     
  3. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    asmlamo
    Не мож, а портит.
     
  4. kalexi

    kalexi New Member

    Публикаций:
    0
    Регистрация:
    11 сен 2007
    Сообщения:
    43
    Блин, так и знал! )) Спасибо!
     
  5. KIV

    KIV Member

    Публикаций:
    0
    Регистрация:
    16 июл 2009
    Сообщения:
    231
    Функции WinAPI сохраняют регистры EBX, ESI, EDI и EBP. Остальные регистры в 99% случаев будут затёрты после вызова и поэтому их надо сохранять если данные в них нужны дальше.
     
  6. kalexi

    kalexi New Member

    Публикаций:
    0
    Регистрация:
    11 сен 2007
    Сообщения:
    43
    Тогда еще два вопроса:
    -Как процедуре передать параметры (или как их использовать), чтобы можно было вызвать "cmp byte[ebx],param"? Вначале необходимо сдалать так mov bl, byte[opcode] а потом сравнивать регистры?
    -Как вернуть результат функции (макроса Proc)?
     
  7. asmlamo

    asmlamo Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    1.742
    Передают через стек.
     
  8. KIV

    KIV Member

    Публикаций:
    0
    Регистрация:
    16 июл 2009
    Сообщения:
    231
    Результат функции помещают в регистр EAX перед самым выходом (чтобы не затереть и его могла прочитать вызывающая программа) из функции.
     
  9. kalexi

    kalexi New Member

    Публикаций:
    0
    Регистрация:
    11 сен 2007
    Сообщения:
    43
    Ясно, спасибо.
     
  10. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    Это точно. EBX, ESI, EDI и EBP нужно использовать очень осторожно. Иногда случается слет проги если их применять в своих целях, при вызовах API их содержимое лучше оставить неизменным (из личного опыта). Удачи!
     
  11. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Эти регистры надо сохранять только в функциях типа CALLBACK (WNDPROC, DLGPROC, WNDENUMPROC, LPTHREAD_START_ROUTINE и т.п.). Все остальные функции - не нужно ничего сохранять. Наоборот, тем фактом, что API не меняет эти регистры надо пользоваться. Например, если в крупном цикле вызывается API, то можно загрузить адрес API процедуры в регистр - например, в ESI/EDI и далее в цикле вызывать через регистр, а не через invoke.
     
  12. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.914
    AsmGuru62
    WNDPROC, DLGPROC глубоко фиолетово содержимое EBX, ESI, EDI и EBP а вот в kernel mode драйверах содержимое этих регистров нужно сохранять при входе в процедуры и восстанавливать при выходе, если эти регистры используются