Поведение условного ассемблирования

Тема в разделе "WASM.BEGINNERS", создана пользователем botmen, 12 сен 2011.

  1. botmen

    botmen Member

    Публикаций:
    0
    Регистрация:
    2 сен 2007
    Сообщения:
    43
    Определяю локальные так
    Код (Text):
    1. if DEBUG
    2.     RESMNGRFINDRESS_LOCALVARS = 7
    3.     locals
    4.         firsthandle dd ? ;
    5.         maxpath dd ? ;
    6.         pfileinfostruc dd ? ;
    7.         offsettopath dd ? ;
    8.         pcFileName dd ? ;
    9.         newobjscount dd ? ;
    10.         newresscount dd ? ;
    11.         fileinfostruc WIN32_FIND_DATA
    12.     endl
    13. else
    14.     RESMNGRFINDRESS_LOCALVARS = 5
    15.     locals
    16.         firsthandle dd ? ;
    17.         maxpath dd ? ;
    18.         pfileinfostruc dd ? ;
    19.         offsettopath dd ? ;
    20.         pcFileName dd ? ;
    21.         fileinfostruc WIN32_FIND_DATA
    22.     endl
    23. end if
    далее в коде
    Код (Text):
    1. lea reg, [firsthandle]
    не компилится и бредовая ошибка (мусор). Работает так
    Код (Text):
    1. locals
    2.     RESMNGRFINDRESS_LOCALVARS = 5
    3.     firsthandle dd ? ;
    4.     maxpath dd ? ;
    5.     pfileinfostruc dd ? ;
    6.     offsettopath dd ? ;
    7.     pcFileName dd ? ;
    8.     if DEBUG
    9.         RESMNGRFINDRESS_LOCALVARS = 7
    10.         newobjscount dd ? ;
    11.         newresscount dd ? ;
    12.     end if
    13.     fileinfostruc WIN32_FIND_DATA
    14. endl
    Почему не работает первый вариант?
    Вот так тоже не работает
    Код (Text):
    1. if DEBUG
    2.  proc * uses *, *, *, dbg_var
    3. else
    4.  proc * uses *, *, *
    5. end if
     
  2. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    botmen
    Не мусор, а приводить ошибку надо.

    locals — макрос, т.е. раскрывается на этапе препроцессорной обработки. if-else-end if — директивы условного ассемблирования, т.е. обрабатываются после препроцессорной обработки.

    Т.о. будут сначала раскрыты оба макроса, в результате чего первый макрос locals определит локальный синоним символу firsthandle, а второй макрос locals переопределит символ firsthandle другим локальным синонимом. Соответственно использоваться firsthandle будет согласно синониму, определённому вторым блоком locals. Но на этапе ассемблирования метки второго блока не будут обработаны, если DEBUG <> 0. Отсюда будет возникать ошибка о неопределённой метке. Если же DEBUG = 0, всё должно скомпилироваться нормально.

    Отсюда мораль: использовать директиву условной препроцессорной обработки (match), а не условного ассемблирования (if-else-end if). И константу DEBUG соответственно определять, как символическую (equ или define), а не как числовую (знак равенства). Хотя вариант "работает так" лучше, конечно, чем использование match.
     
  3. botmen

    botmen Member

    Публикаций:
    0
    Регистрация:
    2 сен 2007
    Сообщения:
    43
    ох уж эти тонкие хитрожопости, в принципе я так и думал
    в мане постоянно пропускал раздел с match и как-то не отличал equ от =. для констант оно работает
    у match_а нет else, некрасиво получается
    ошибко така была undefined symbol '..var?aw'
    большое спасибо за подробность
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    botmen
    Ну да. Стандартный способ обхода этого неудобства такой:
    Код (Text):
    1. define matched -
    2. match something,something_else
    3. {
    4.     ;if matched part
    5.     restore matched
    6.     define matched +
    7. }
    8. match -,matched
    9. {
    10.     ;if not matched part
    11. }
    12. restore matched
    В частности поэтому вариант "работает так" лучше.
    Не помешала бы... раньше :). ..var?aw — имя локального синонима (по факту просто значение) символа firsthandle, назначенное вторым макросом locals. Хотя первое значение (какой-нибудь ..var?aс) не исчезло, а осталось в стеке значений firsthandle.
     
  5. botmen

    botmen Member

    Публикаций:
    0
    Регистрация:
    2 сен 2007
    Сообщения:
    43
    Неинтуетивненько (прям как это слово), хотя какая мне разница что дублировать в код.)
    Ну, я так понял, при моём рабочем варианте в стеке переменные всё равно не выделяться - это и требуется.
    Решил остаться при старом, чтобы не патчить исходники. Разобрался и ладно, Добрый_Человек.