макрос .FOR

Тема в разделе "WASM.BEGINNERS", создана пользователем asmic, 12 июл 2007.

  1. asmic

    asmic New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2007
    Сообщения:
    85
    Как работает макрос .FOR?

    FOR parameter[:REQ|:=default], <argument [,argument]...>
    statements
    ENDM

    Как с помощью него создать цикл: for (int i = 0; i < a; i++)?
     
  2. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    iirc, никак ибо этот макрос используеться для генерации данных или кода до компиляции..а
     
  3. asmic

    asmic New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2007
    Сообщения:
    85
    а как тогда создать цикл for (int i = 0; i < a; i++) на masm32?
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    .FOR - разве есть такой? Есть FOR - но он выполняется на стадии компиляции.

    Если хочется высокоуровневости, то есть .while и .repeat.
     
  5. asmic

    asmic New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2007
    Сообщения:
    85
    я прошу подсказать, как реализовать цикл for (int i = 0; i < a; i++) на masm32. заранее спасибо.
     
  6. Sturgeon

    Sturgeon New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2006
    Сообщения:
    111
    Цикл получается вроде такого
    ........
    mov ebx, a ; В ebx помещаем значение a
    xor eax, eax ; Это, типа, i=0
    loop:
    inc eax ; i++
    cmp eax,ebx ; Сравниваем i с a или можно так: cmp eax, a
    jne loop ; Если не равно, то прыгаем на метку loop
    ..........
    При таком написании переменная i в любом случае один раз инкриментируется. Если этого быть не должно, то можно чуть по другому написать, добавив еще один условный переход.
     
  7. asmic

    asmic New Member

    Публикаций:
    0
    Регистрация:
    19 фев 2007
    Сообщения:
    85
    спасибо. всё ясно.
     
  8. S_Alex

    S_Alex Alex

    Публикаций:
    0
    Регистрация:
    27 авг 2004
    Сообщения:
    561
    Адрес:
    Ukraine
    Можно заменить на такое:

    Код (Text):
    1.         .while  eax <= ebx
    2.  
    3.             inc eax
    4.         .endw
     
  9. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    asmic
    для asm стараются заменить for (int i = 0; i < a; i++) на for (int i = a; i > 0; i--) и тогда если нужна компактность
    Код (Text):
    1. mov ecx,a
    2. a1: ........
    3.      loop a1
    а если хочется скорости
    Код (Text):
    1. mov ebx,a ; содержимое ebx,edi,esi,ebp функции WinAPI не изменяют
    2. a1: ........
    3.      dec ebx
    4.      jnz a1
     
  10. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Тогда уж sub ebx,1
     
  11. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Вообще-то если совсем корректно, то
    Код (Text):
    1.     mov eax, a
    2.     or eax, eax
    3.     jmp z1_c
    4. z1:
    5.     ...
    6.     sub eax, 1
    7. z1_c:
    8.     jnz z1
     
  12. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Ustus
    тогда для корректности и
    Код (Text):
    1.     mov ecx,a
    2.     jecxz a2
    3. a1: ....
    4.     loop a1
    5. a2:....
     
  13. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Mikl__
    Ну, здесь вообще-то еще и об эффективности шла речь, а jecxz и loop - тяжеловатые монстры...
     
  14. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Ustus
    В #9 были показаны два варианта: компактный и скорострельный, jecxz к компактному:)
    or reg,reg (варианты and reg,reg /test reg,reg) и jnz ко второму варианту
     
  15. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Mikl__
    Я имел ввиду, что в #9 не учитывается случай a = 0. А если в #12 разбить сложные инструкции на простые, то получится #11 с точностью до одного перехода :)
    Это уже вопрос контекстной оптимизации, что выбрать, в зависимости от наиболее вероятного значения a и вложенности цикла более эффективным может получится тот или другой вариант... ИМХО... вот если бы пришел leo, он бы это уже разобрал по косточкам :) но, к сожалению, его не привлекают темы, в названии которых нет слова "оптимизация" :dntknw:
    :):):)