Всем привет. Подскажите, как на макросах фасма можно сделать следующее. В зависимости от значения n, cmd должна принимать значение mov или xor. Теоретически код должен работать, но интерпретатор игнорирует условия, и подставляет всегда последнее значение. Код: Код (Text): macro maken n { local cmd if n=1 cmd equ mov end if if n=2 cmd equ xor end if cmd esi, eax } Каким образом можно заставить его работать правильно?
Код (Text): macro maken n { if n=1 mov esi, eax else if n=2 xor esi, eax end if } macro maken2 n { if n=1 cmd=8Bh else if n=2 cmd=33h end if db cmd, 0F0h }
если бы все было так просто... я хотел сделать подобие полиморфного генератора Посмотрел документацию, вот что в ней написано: Код (Text): I'm trying to conditionally define some constant with equ directive by putting it in the if block, but it seems that even when this condition is false, the constant gets defined. Why? That's because all symbolic constants and macroinstruction (that means every symbol you define with equ, macro, or struc directive) are processed at the preprocessor stage, while directives like if or repeat are processed at assembly stage, when all macroinstructions and symbolic constants have already been replaced with corresponding values (generally structures which you have to end with the end directive followed by the name of structure are processed at assembly stage). On the other hand, the numerical constants (which you define with = symbol) are of the same kind as labels, and therefore are processed at assembly stage, so you can define and use them conditionally. Видимо придется писать свой препроцессор... а жаль, у фасма макросы вполне на уровне.
Поскольку макросы раскрываются во время препроцессинга, то и использовать в данном случае нужно директивы времени препроцессинга (а "if" – директива времени компиляции). Код (Text): macro maken n { match =1,n \{ xor eax, eax \} match =2,n \{ mov eax, 0 \} }