Товарищи знатоки подскажите, можно ли использовать данную директиву применительно к процедурам/функциям ? Вообще справочники говорят то что она применима к переменным, а возможно ли немного иначе? То есть допустим есть простейшая процедура ABCD, находящаяся не в основном проекте, допустим main.asm, а в подключаемом модуле etc.inc ABCD proc ret ABCD endp Можно ли с помощью данной директивы задать её условное компилирование? То есть, допустим если поисходит вызов этой процедуры из main.asm, предварительно вложив модуль etc.inc, тогда эта процедура будет присутствовать в бинарнике, а иначе, если же её вызов не произошёл из основного проекта, она так и останется в исходнике, в модуле etc.inc, и в бинарнике уже присутствовать не будет
MrMiXeR можно условно компилировать любые куски кода и данных, но автоматически по факту использования это не произойдёт - флаг-условие должен будешь взвести сам, или спрячь вызов нужной функции в макрос, который сразу и фунцию вызовет и флаг взведёт, тогда будет автоматика
; В начале программы (или отдельном файле включаемом include в начале программы) myFunction_proc PROTO WORD, WORD myFunction MACRO param1, param2 invoke myFunction_proc, param1, param2 myFunction_comp = TRUE ; это флаг для условной компиляции ENDM ; В теле программы вместо invoke или call будет: myFunction, param1, param2 ; В конце программы или отдельном файле включаемом в конец: IFDEF myFunction_comp myFunction_proc PROC param1:dword, param2:dword ... ret myFunction_proc ENDIF ; Если функции нужны персональные глобальные или иннициализированные переменные то добавляешь например: IFDEF myFunction_comp .data ... определение данных .code ; возврат в сегмент кода ENDIF
x0man Да чего тут особо придумывать Когда кодил в тасме, который не умеет отдельные функции из либ выдирать, то вообще все штатные инклюды в такую форму переделывал, чтобы прилинковывались только нужные апи, а не все подряд ) Сейчас только свои не всегда используемые типовые подпрограммы так оборачиваю - вполне удобно. Только ещё условно компилируемые подпрограммы в макрос EndProgramm заворачиваю, чтобы можно было все инклюды (в том числе и содержащие этот макрос с подпрограммами) в начале подключать.
x0man Ты это как бы к тому что в ... ret myFunction_proc ENDP потерялась директива ENDP? Дык обычная очепятка - сути примера это не меняет %))
Y_Mur Мдя... Ты сам проверял вообще этот пример на MASM'е? Если да, то скинь сурсы плиз, мне чтото захотелось посмотреть.
x0man Так и не понял что тебе не понятно - вот нормально компилящийся пример, естественно упрощённый по самое нимагу Реальные из своих программ не привожу, поскольку они шибко навороченные, но условно компилятся и они без проблем )
MrMiXeR Более подробный пример с подключаемым модулем, раздельной условной компиляцией данных и подпрограмм, завернутые в общий макрос размещаемый обязательно в конце программы, когда все флаги условной компиляции уже определились.
А как насчет процедур, вызывающих другие условно-компилируемые процедуры? Например из второй процедуры вызывается первая, которую компилятор уже проехал, когда флага компиляции еще не стояло? Сам вот мучаюсь, не хочу быть похожим на мелко$офт - "Крестики-нолики" дистриб на 3-х DVD ) Я худею )))))
товарич вы создаете моногомодульный проект у вас получается полюбому 2 obj файла main.obj и abcd.obj чтобы код abcd добавился в исполняемый файл вы должны были в main.asm указать прототип функции и инструкцию на нее ссылающуюся хоть call f_abcd хоть lea EAX,f_abcd если будет только прототип то код автоматичеки не будет включен в исполняемый файл однако если сделать 2 пототипа то код abcd.obj будет включен в exe - сам наткнулся