есть ли в фасме аналоги директив компилятора ... напрмиер как в VC Код (Text): #define DEBUG #ifdef DEBUG // ... #else // ... #endif
ФАСМ вообще вещь. ФАСМ рулит, и будет рулить! Что касается директив компилятора, поиск по сайту. Я как раз таким образом нашел себе материалы по fasm, после чего и подсел на него.
Quantum: Het. Tвая прогрлама есть неверной. Ето как "if ~ defined 1" в препроцесорн: Код (Text): SYMBOL equ 1 match =1, SYMBOL { db 'дефинованиь',0 } match =SYMBOL, SYMBOL { db 'нет дефинованиь',0 } в асемблери используйте макро "ifndef": Код (Text): macro ifndef expr* { local ..HERE if defined ..HERE | ~ defined expr ..HERE = 1 } a: if ~ defined a display '~ defined a',10 end if if ~ defined b display '~ defined b',10 end if if ~ defined c display '~ defined c',10 end if ifndef a display 'ifndef a',10 end if ifndef b display 'ifndef b',10 end if ifndef c display 'ifndef c',10 end if b:
vid Example 1: Код (Text): if ~ defined DEBUG nop else int3 end if Assembles a nop. Example 2: Код (Text): define DEBUG 1 if ~ defined DEBUG nop else int3 end if This time we get an int3. So, it's correct.
Код (Text): if ~defined X define Y 1 end if if ~defined Y display 'works' else display 'doesnt work' end if
vid Ты неправ, if defined работает именно так, как написал Quantum, смотри справку. Другое дело, что если это нужно использовать как в сях (#ifndef X #define X #endif), тогда уже применять такой код, как у тебя.
макрос, который проверяет наличие переменной DEBUG_VERSION, и вставляет отладочный код в случаях, если она не определена или равна 1 Код (Text): macro deb { local ..nodeb if defined DEBUG_VERSION if DEBUG_VERSION pusha invoke IsDebuggerPresent test eax,eax popa jz ..nodeb int3 ..nodeb: end if else pusha invoke IsDebuggerPresent test eax,eax popa jz ..nodeb int3 ..nodeb: end if } макрос с блокированием повторного включения текста: Код (Text): macro CSSupport { if ~ defined CSSupportUsed CSSupportUsed equ 1 ......... end if }
"if" в фасме есть ассеимблерова директива, нет препроцесорова (как "#if" в C). директива "define" ест препроцесороваю директива "if defined" ест ассеимблерова. это проверяет, определенный ли все навестия. Код (Text): a: if defined (a+8*(b shl 5)) display 'yeah' end if if defined (a+8*(c shl 5)) display 'uh-oh' else b db " <|> ",0 "if defined 1" всегда правда.