Макрос в Масм32

Тема в разделе "WASM.ASSEMBLER", создана пользователем sds, 10 мар 2007.

  1. sds

    sds New Member

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

    Возникла такая проблема...
    Пытаюсь написать макрос...

    ===
    macro
    LOCAL e, Ex
    e = 0
    cmp eax, 777
    jbe Ex
    e = e + 1
    GOTO g1
    Ex:
    ...
    :g1

    endm

    Выдает ошибку, Goto похоже все портит, а если без него, то тогда " e = e + 1" выполняется в любом случае:-/ независимо от значения еах...
    Пытался что-то через IFIDNI xxx, <EQUAL?> изобразить - не вышло:dntknw:(
    Может вопрос глупый, но пожалуйста помогите, уже второй день все макросы какие нашел читаю, ничего похожего не нашел:dntknw:(

    Как узнать результат "cmp eax, 777" с помощью макро?

    PS
    И где можно почитать про макросы побольше? Статьи на сайте видел, но маловато...
     
  2. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Никак ;) - макрос выполняется на этапе компиляции программы, а значение eax будет известно только при выполнении готовой программы.
    Кстати в масме есть много тонкостей когда "очевидные" макросы оказываются нерабочими из-за многопроходности и непонятных ляпов разработчика - обычно эти грабли выявляются "методом научного тыка" и устраняется путём медитации над поведением компилятора :)
     
  3. sds

    sds New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2004
    Сообщения:
    3
    >Никак ;) - макрос выполняется на этапе компиляции программы, а значение eax будет
    >известно только при выполнении готовой программы.
    Я думал над этой благой мыслью, но ведь макросы с условиями (иф) как-то работают!
    (видел где-то и там был именно IFIDNI xxx, <EQUAL?>, только вот не помню где видел:dntknw:()
    Может все-таки можно?

    >Кстати в масме есть много тонкостей когда "очевидные" макросы оказываются
    >нерабочими из-за многопроходности и непонятных ляпов разработчика - обычно эти
    >грабли выявляются "методом научного тыка" и устраняется путём медитации над
    >поведением компилятора :)
    Да я уж второй день медитирую, все глюки прочие устранил, последний остался...

    А насчет меток, может с помощью них можно как-то выполнить условия?
     
  4. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    sds
    Есть две разновидности IF макросов (точнее вторая разновидность называется HiLevel синтаксисом)
    Макроконструкции типа IFIDNI предназначены для того чтобы анализировать параметры передаваемые макросу, ннапример:
    Код (Text):
    1. MyFPUcode MACRO In, Out
    2.  IFIDNI <In>, <Pi>
    3.    FLDPI
    4.  ESLSEIFIDNI <In>, <1>
    5.    FLD1
    6.  ELSE
    7.    FLD In
    8.  ENDIF
    9. ..... что то делаем с In
    10.  IFNB <Out>
    11.    FSTP Out
    12.  ENDIF
    13. ENDM
    Этот макрос включит в готовый код только одну из команд FLDPI, FLD1, FLD [число в памяти], в зависимости от того является параметр In стандартной константой или произвольным числом и пометстит результат либо в указанную переменную Out, либо оставит его в регистре ST(0) если параметр Out не использован. Обрати внимание: к моменту вызова этого макроса совершенно точно известно что он должен загрузить и куда потом это положить, просто в разных местах проги он будет вызван в разных вариантах и соответственно сгенерирует разный код ;)

    HiLevel синтаксис .IF это не макросы, хотя похожы и их часто "до кучи" так называют (кстати можешь заглянуть в их альтернативную реализацию с помощью макросов)
    Они как раз компилируются в конструкцию cmp... + j... c автоматической генерацией меток, но на этапе компиляции они тоже не могут определить произойдёт этот j.. или нет :)
     
  5. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    sds
    Хотя вообще-то можно - достаточно написать на макросах эмулятор твоего кода ;)
    т.е. всем регистрам сопоставить константы и после всех асм команд, то же самое делать с константами :) только соответственно чужие функции не вызывать и обязательно будут вышеупомянутые грабли с многопроходностью, но если хорошенько поизвращаться то может и получиться :)))
     
  6. sds

    sds New Member

    Публикаций:
    0
    Регистрация:
    20 мар 2004
    Сообщения:
    3
    >Хотя вообще-то можно - достаточно написать на макросах эмулятор твоего кода ;)
    Тоже выход;)) Хотя и доооолгий:)) спасибо, буду иметь ввиду, но пока как-то без этого попробую.

    Итак, хочу сказать большое спасибо вам за ответы... Медитировал... Осознал... понял как жестоко заблуждался, понял как все работает, понял почему у меня не сработает то что я захотел написать, изучил макросы из аттача, очень полезно... Спасибо.

    И понял что моя мечта о макросе_который_может_спасти_от_чего_угодно - уточпина:)) А жаль, так порой хочется верить в чудеса;)) Чтож будем писать такой же, но без крыльев!:))

    спасибо еще раз, эти два дня сидения за макросом который невозможно создать, не прошли зря, основательно изучил и проникся макроязыком, тоже польза и немалая:)) А ваши ответы, помогли расставить точки над "ё"... Спасибо за них.