Доброго времени... Возникла такая проблема... Пытаюсь написать макрос... === 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?> изобразить - не вышло( Может вопрос глупый, но пожалуйста помогите, уже второй день все макросы какие нашел читаю, ничего похожего не нашел( Как узнать результат "cmp eax, 777" с помощью макро? PS И где можно почитать про макросы побольше? Статьи на сайте видел, но маловато...
Никак - макрос выполняется на этапе компиляции программы, а значение eax будет известно только при выполнении готовой программы. Кстати в масме есть много тонкостей когда "очевидные" макросы оказываются нерабочими из-за многопроходности и непонятных ляпов разработчика - обычно эти грабли выявляются "методом научного тыка" и устраняется путём медитации над поведением компилятора
>Никак - макрос выполняется на этапе компиляции программы, а значение eax будет >известно только при выполнении готовой программы. Я думал над этой благой мыслью, но ведь макросы с условиями (иф) как-то работают! (видел где-то и там был именно IFIDNI xxx, <EQUAL?>, только вот не помню где видел() Может все-таки можно? >Кстати в масме есть много тонкостей когда "очевидные" макросы оказываются >нерабочими из-за многопроходности и непонятных ляпов разработчика - обычно эти >грабли выявляются "методом научного тыка" и устраняется путём медитации над >поведением компилятора Да я уж второй день медитирую, все глюки прочие устранил, последний остался... А насчет меток, может с помощью них можно как-то выполнить условия?
sds Есть две разновидности IF макросов (точнее вторая разновидность называется HiLevel синтаксисом) Макроконструкции типа IFIDNI предназначены для того чтобы анализировать параметры передаваемые макросу, ннапример: Код (Text): MyFPUcode MACRO In, Out IFIDNI <In>, <Pi> FLDPI ESLSEIFIDNI <In>, <1> FLD1 ELSE FLD In ENDIF ..... что то делаем с In IFNB <Out> FSTP Out ENDIF ENDM Этот макрос включит в готовый код только одну из команд FLDPI, FLD1, FLD [число в памяти], в зависимости от того является параметр In стандартной константой или произвольным числом и пометстит результат либо в указанную переменную Out, либо оставит его в регистре ST(0) если параметр Out не использован. Обрати внимание: к моменту вызова этого макроса совершенно точно известно что он должен загрузить и куда потом это положить, просто в разных местах проги он будет вызван в разных вариантах и соответственно сгенерирует разный код HiLevel синтаксис .IF это не макросы, хотя похожы и их часто "до кучи" так называют (кстати можешь заглянуть в их альтернативную реализацию с помощью макросов) Они как раз компилируются в конструкцию cmp... + j... c автоматической генерацией меток, но на этапе компиляции они тоже не могут определить произойдёт этот j.. или нет
sds Хотя вообще-то можно - достаточно написать на макросах эмулятор твоего кода т.е. всем регистрам сопоставить константы и после всех асм команд, то же самое делать с константами только соответственно чужие функции не вызывать и обязательно будут вышеупомянутые грабли с многопроходностью, но если хорошенько поизвращаться то может и получиться ))
>Хотя вообще-то можно - достаточно написать на макросах эмулятор твоего кода Тоже выход) Хотя и доооолгий) спасибо, буду иметь ввиду, но пока как-то без этого попробую. Итак, хочу сказать большое спасибо вам за ответы... Медитировал... Осознал... понял как жестоко заблуждался, понял как все работает, понял почему у меня не сработает то что я захотел написать, изучил макросы из аттача, очень полезно... Спасибо. И понял что моя мечта о макросе_который_может_спасти_от_чего_угодно - уточпина) А жаль, так порой хочется верить в чудеса) Чтож будем писать такой же, но без крыльев!) спасибо еще раз, эти два дня сидения за макросом который невозможно создать, не прошли зря, основательно изучил и проникся макроязыком, тоже польза и немалая) А ваши ответы, помогли расставить точки над "ё"... Спасибо за них.