Использование директивы IFDEF в masm

Тема в разделе "WASM.ASSEMBLER", создана пользователем MrMiXeR, 3 июл 2009.

  1. MrMiXeR

    MrMiXeR New Member

    Публикаций:
    0
    Регистрация:
    27 июн 2008
    Сообщения:
    97
    Товарищи знатоки подскажите, можно ли использовать данную директиву применительно к процедурам/функциям ? Вообще справочники говорят то что она применима к переменным, а возможно ли немного иначе?

    То есть допустим есть простейшая процедура ABCD, находящаяся не в основном проекте, допустим main.asm, а в подключаемом модуле etc.inc

    ABCD proc

    ret
    ABCD endp


    Можно ли с помощью данной директивы задать её условное компилирование? То есть, допустим если поисходит вызов этой процедуры из main.asm, предварительно вложив модуль etc.inc, тогда эта процедура будет присутствовать в бинарнике, а иначе, если же её вызов не произошёл из основного проекта, она так и останется в исходнике, в модуле etc.inc, и в бинарнике уже присутствовать не будет
     
  2. Y_Mur

    Y_Mur Active Member

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

    MrMiXeR New Member

    Публикаций:
    0
    Регистрация:
    27 июн 2008
    Сообщения:
    97
    а можно пример ?
     
  4. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    ; В начале программы (или отдельном файле включаемом include в начале программы)
    myFunction_proc PROTO :lol: WORD, :lol: 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
     
  5. x0man

    x0man New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2008
    Сообщения:
    358
    Y_Mur
    Сам придумал? :)
     
  6. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    x0man
    Да чего тут особо придумывать ;) Когда кодил в тасме, который не умеет отдельные функции из либ выдирать, то вообще все штатные инклюды в такую форму переделывал, чтобы прилинковывались только нужные апи, а не все подряд :)) Сейчас только свои не всегда используемые типовые подпрограммы так оборачиваю - вполне удобно. Только ещё условно компилируемые подпрограммы в макрос EndProgramm заворачиваю, чтобы можно было все инклюды (в том числе и содержащие этот макрос с подпрограммами) в начале подключать.
     
  7. x0man

    x0man New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2008
    Сообщения:
    358
    Y_Mur
    Я вообщето веду к тому, что... это как бы не работает в масме...
     
  8. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    MrMiXeR
    Почему бы, вам не исследовать генерируемый компилятором код в дизассемблере самому?
     
  9. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    x0man
    Ты это как бы к тому что в
    ...
     ret 
    myFunction_proc ENDP
    потерялась директива ENDP?
    Дык обычная очепятка - сути примера это не меняет %))
     
  10. x0man

    x0man New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2008
    Сообщения:
    358
    Y_Mur
    Мдя...

    Ты сам проверял вообще этот пример на MASM'е?
    Если да, то скинь сурсы плиз, мне чтото захотелось посмотреть.
     
  11. Y_Mur

    Y_Mur Active Member

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

    x0man New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2008
    Сообщения:
    358
    Хм... ок
     
  13. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    MrMiXeR
    Более подробный пример с подключаемым модулем, раздельной условной компиляцией данных и подпрограмм, завернутые в общий макрос размещаемый обязательно в конце программы, когда все флаги условной компиляции уже определились.
     
  14. MrMiXeR

    MrMiXeR New Member

    Публикаций:
    0
    Регистрация:
    27 июн 2008
    Сообщения:
    97
    ай спасибо, проблему решил !
     
  15. Fedor666

    Fedor666 Fedor

    Публикаций:
    0
    Регистрация:
    27 май 2009
    Сообщения:
    30
    Адрес:
    М.О., г.Королев
    А как насчет процедур, вызывающих другие условно-компилируемые процедуры? Например из второй процедуры вызывается первая, которую компилятор уже проехал, когда флага компиляции еще не стояло? Сам вот мучаюсь, не хочу быть похожим на мелко$офт - "Крестики-нолики" дистриб на 3-х DVD :)) Я худею ;))))))
     
  16. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    пример можно сказать классика жанра

    Код (Text):
    1. myfun proto near
    2.  
    3. ifdef myfun
    4. call myfun
    5. endif
     
  17. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    x0man
    в масме все замечательно работает
     
  18. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    товарич вы создаете моногомодульный проект
    у вас получается полюбому 2 obj файла main.obj и abcd.obj
    чтобы код abcd добавился в исполняемый файл вы должны были в main.asm указать прототип функции и инструкцию на нее ссылающуюся хоть call f_abcd хоть lea EAX,f_abcd

    если будет только прототип то код автоматичеки не будет включен в исполняемый файл

    однако если сделать 2 пототипа то код abcd.obj будет включен в exe - сам наткнулся