Проблема с макроциклами

Тема в разделе "WASM.ASSEMBLER", создана пользователем ASMatik, 3 июл 2008.

  1. ASMatik

    ASMatik New Member

    Публикаций:
    0
    Регистрация:
    3 июл 2008
    Сообщения:
    27
    Не могу понять как правильно задать expression для макро .WHILE
    Написал процедуру:

    Код (Text):
    1. CreateBarBuffer proc cmptDC:HDC,lpPath:LPSTR,imgW:DWORD,imgH:DWORD,cnt:DWORD
    2.   LOCAL count   :DWORD
    3.  
    4.   ...
    5.   ...
    6.   mov count, 0
    7.   .WHILE (count != cnt)
    8.       ...
    9.       inc count
    10.   .ENDW
    11. CreateBarBuffer endp
    Вот проблема в том, что из-за этой записи (count != cnt) не могу скомпилить. Вылетает ошибка:
    Сорри конечно за глупый вопрос, но опыт у меня в асме небольшой, поэтому решил спросить у старших товарищей))) Компилятор masm
     
  2. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    нельзя сравнивать две памяти.
     
  3. ASMatik

    ASMatik New Member

    Публикаций:
    0
    Регистрация:
    3 июл 2008
    Сообщения:
    27
    А как тогда реализовать это? (Чтобы я мог получать из аргумента количество повторов цикла). Пробовал делать через стэк, что-то типа:
    Код (Text):
    1. push cnt
    2. pop ebx
    3. .WHILE (counter != ebx)
    4. ...
    Только цикл не работал после этого )))) может потому что руки кривоваты, точно не знаю)))
     
  4. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Код (Text):
    1. CreateBarBuffer proc uses edi cmptDC:HDC,lpPath:LPSTR,imgW:DWORD,imgH:DWORD,cnt:DWORD
    2.  
    3.   ...
    4.   ...
    5.   xor edi, edi
    6.   .WHILE (edi != cnt)
    7.       ...
    8.       inc edi
    9.   .ENDW
    10. CreateBarBuffer endp
     
  5. ASMatik

    ASMatik New Member

    Публикаций:
    0
    Регистрация:
    3 июл 2008
    Сообщения:
    27
    Хм. Сейчас через стэк почему-то заработало. Пойду куплю себе аппарат Елизарова)))
    А если серьезно, почему могло вообще такое быть? одно время когда делал через стэк дико тупило

    To2FED
    Большое спасибо, твой вариант тоже работает
     
  6. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    ты делал через EBP(Base Pointer) через который адресуются стек в процедуре, а ты его затёр и получилась у тебя фигня.

    так делать не надо
    push cnt
    pop ebx

    так нужно делать если ты пересылаешь из памяти в память а поскольку тут фигурирует регистр то можно было бы написать просто mov ebp,esp опять таки ebp не трогай, выбери другой регистр, я в своём примере выбрал edi и добавил строчку uses edi чтобы он восстанавливался при выходе из процедуры
     
  7. ASMatik

    ASMatik New Member

    Публикаций:
    0
    Регистрация:
    3 июл 2008
    Сообщения:
    27
    Большое спасибо за инфу. Все работает.