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

Discussion in 'WASM.BEGINNERS' started by kalexi, Mar 12, 2011.

  1. kalexi

    kalexi New Member

    Blog Posts:
    0
    Ничего не могу понять... Делаю цикл:

    Code (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

    Blog Posts:
    0
    Делай так :

    mov ecx,3

    zzz:
    push ecx
    invoke MessageBox
    pop ecx

    loop zzz


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

    Booster New Member

    Blog Posts:
    0
    asmlamo
    Не мож, а портит.
     
  4. kalexi

    kalexi New Member

    Blog Posts:
    0
    Блин, так и знал! )) Спасибо!
     
  5. KIV

    KIV Member

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

    kalexi New Member

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

    asmlamo Well-Known Member

    Blog Posts:
    0
    Передают через стек.
     
  8. KIV

    KIV Member

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

    kalexi New Member

    Blog Posts:
    0
    Ясно, спасибо.
     
  10. S_Alex

    S_Alex Alex

    Blog Posts:
    0
    Это точно. EBX, ESI, EDI и EBP нужно использовать очень осторожно. Иногда случается слет проги если их применять в своих целях, при вызовах API их содержимое лучше оставить неизменным (из личного опыта). Удачи!
     
  11. AsmGuru62

    AsmGuru62 Member

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

    Mikl___ Супермодератор Staff Member

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