Ничего не могу понять... Делаю цикл: Код (Text): proc GetOpType mov cx,3 @@: invoke MessageBox,0,"","",0 loopw @b ret endp В результате получается бесконечный цикл. Даже если я использую схему "dec cx, jnz" происходит тоже самое. Подскажите пожалуйста. И еще одно, мне надо поочередно в цикле обрабатывать элементы массива. Каким образом это реализуется. p.s. Вообще я думал изначально сделать массив с маркером окончания массива и в цикле ловить его...
Делай так : mov ecx,3 zzz: push ecx invoke MessageBox pop ecx loop zzz И погоняй в дебагере мож invoke MessageBox ecx портит.
Функции WinAPI сохраняют регистры EBX, ESI, EDI и EBP. Остальные регистры в 99% случаев будут затёрты после вызова и поэтому их надо сохранять если данные в них нужны дальше.
Тогда еще два вопроса: -Как процедуре передать параметры (или как их использовать), чтобы можно было вызвать "cmp byte[ebx],param"? Вначале необходимо сдалать так mov bl, byte[opcode] а потом сравнивать регистры? -Как вернуть результат функции (макроса Proc)?
Результат функции помещают в регистр EAX перед самым выходом (чтобы не затереть и его могла прочитать вызывающая программа) из функции.
Это точно. EBX, ESI, EDI и EBP нужно использовать очень осторожно. Иногда случается слет проги если их применять в своих целях, при вызовах API их содержимое лучше оставить неизменным (из личного опыта). Удачи!
Эти регистры надо сохранять только в функциях типа CALLBACK (WNDPROC, DLGPROC, WNDENUMPROC, LPTHREAD_START_ROUTINE и т.п.). Все остальные функции - не нужно ничего сохранять. Наоборот, тем фактом, что API не меняет эти регистры надо пользоваться. Например, если в крупном цикле вызывается API, то можно загрузить адрес API процедуры в регистр - например, в ESI/EDI и далее в цикле вызывать через регистр, а не через invoke.
AsmGuru62 WNDPROC, DLGPROC глубоко фиолетово содержимое EBX, ESI, EDI и EBP а вот в kernel mode драйверах содержимое этих регистров нужно сохранять при входе в процедуры и восстанавливать при выходе, если эти регистры используются