FASM macro: forward & reverse bug?!

Тема в разделе "WASM.ASSEMBLER", создана пользователем Black_mirror, 19 ноя 2006.

  1. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Есть такой не хитрый макрос:
    Код (Text):
    1. macro zzz p,[a]
    2. {
    3. common
    4. display '1'
    5. forward ;или reverse
    6. display '2'
    7. common
    8. display '3'
    9. }
    при его вызове
    zzz z
    компилятор выводит на экран
    123
    это баг или фича?
     
  2. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    а где тут баг?

    или что то должно быть по другому?
     
  3. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Ну, я бы расчитывал получить 13 без 2йки, ведь параметров в квадратных скобках нет и форвард должен выполниться 0 раз...
     
  4. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
     
  5. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    dead_body
    Во-первых, в примере Black_mirror группы отсутствуют, ведь группируются только параметры a, а z нельзя принять за a. z должно быть принято за p.

    Во-вторых, в документации есть пример strtbl, в котором наглядно показано, что группа аргументов - это параметры в скобках, а не все параметры.

    Конечно, ситуацию с нулевым кол-вом аргументов можно считать особым случаем, но это должно быть освещено в документации.
     
  6. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    не понял, где это там показано. Можеш носом ткнуть?


    у Black_mirrorа две группы аргументов, вроде как.

    p - первая группа из одиночного аргумента,[a] - вторая группа.

    в примере strtbl всё так же.(только как мне кажеться, у второго аргумента надо * поставить)
    что бы strtbl так начинался:
    macro strtbl name,[string*]
     
  7. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    а хотя, я может быть и не прав.

    надо бы подумать...
     
  8. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    dead_body
    Аргумент name не обрабатывается в forward. name обрабатывается в common. Если бы name обрабатывался в forward, то это был бы уже не классический string table.
     
  9. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    всё, я окончательно запутался...
    удаляюсь на сон, утро вечера мудреней.
     
  10. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Не баг, т.к. вроде в документации прямо не указано, что если аргументов нет, то блок не будет обработан. Но отсутствие фичи налицо.

    А во всех сорцах есть явная проверка на наличие агрументов (в документации пример без оной):
    Код (Text):
    1. macro m a*,[b]
    2.  {
    3.     common
    4.         display '1'
    5.         if ~ b eq
    6.             forward
    7.                 display '2'
    8.         end if
    9.     common
    10.         display '3' %%L
    11.  }
    Правда, if - директива ассемблера. Для препроцессора надо типа этого:
    Код (Text):
    1. macro m a*,[b]
    2.  {
    3.     common
    4.         display '1'
    5.         match args,b
    6.         \{
    7.             forward
    8.                 display '2'
    9.             common
    10.         \}
    11.     common
    12.         display '3'
    13.  }
     
  11. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    последний common можно убрать.
     
  12. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    dead_body
    Остался от первого примера :)