Макро не работает.

Тема в разделе "WASM.ASSEMBLER", создана пользователем Clerk, 14 мар 2009.

  1. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Привет.
    Проблема в следующем.
    Нужно определить новый набор инструкций. Например короткий условный переход.
    В нём смещение. Красиво будет так:
    Код (Text):
    1. label_:
    2.     nop
    3.     jt label_
    Макрос без всего лишнего такой:
    Код (Text):
    1. jt macro Address:REQ
    2.     Disp = ($ - Address)
    3.     if Disp gt 127
    4.     .err
    5.     endif
    6.     BYTE Disp + 1
    7. endm
    Так компилится. Если метка определена ниже вызова макроса то пишет ошибку:
    "error A2006 undefined symbol Disp"
    "jt(2) Macro Called From"
    Тоесть так не работает:
    Код (Text):
    1.     jt label_
    2.     nop
    3. label_:
    Масм многопроходовый компилятор, видимо макро раскрывает есчо до определения всех меток, поэтому offset не помогает. Никак не пойму в чём трабла.
     
  2. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    У меня скомпилилось и так и так masm этот:
    http://www.microsoft.com/downloads/details.aspx?FamilyID=7A1C9DA0-0510-44A2-B042-7EF370530C64&displaylang=en
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Y_Mur
    Не устанавливается:
    [​IMG]
    У меня версия 6.14, попробую скачать 10 пакет с васма может пойдёт.
     
  4. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Странно, когда я качал такого не было, в 10 пакете Хутчессона всё равно древний компилятор
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Y_Mur
    Попробовал твой, спасибо. Но всёравно таже ошибка. Как ты компилишь, всмысле что в заголовке ?
     
  6. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Извиняюсь, случайно поместил вызов макроса в него самого, потому и скомпилилось...
     
  7. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    Clerk, пропатчи компилятор чтоб не мявкал, листинг то получается нормальный!
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    litrovith
    Можно я уже думал, но это скрипты поэтому придётся долго разбирать как работает.
     
  9. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    Clerk, там у тебя получается, что Disp меньше нуля, т.е. проверять что Disp может быть больше 127 смысла не имеет.
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    litrovith
    Само сабой. Проверить я проверю, скажи как заставить хоть это работать.
     
  11. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    Сделай для меток ниже вызова макроса другой, без проверки.
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Если метка ниже(в сурце) макро говорит что эта метка не определена для этого:
    Код (Text):
    1. jt macro Address:REQ
    2.     if (Address gt $)
    3.     echo ++++
    4.     endif
    5. endm
    Если так сделать то работает:
    Код (Text):
    1. jt macro Address:REQ
    2.     BYTE (Address - $)
    3. endm
    Так тоже компилит:
    Код (Text):
    1. jt macro Address:REQ
    2.     Disp1 = (Address - $)
    3.     Disp2 = ($ - Address)
    4.     BYTE Disp1, Disp2
    5. endm
    А в условии никак.
    В этом и проблема, при проверке выдаёт ошибку.
     
  13. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    Clerk, что в етом именно в етой проверке проблема я понял после второй безуспешной попытки компила. И вариантов всяких разных тож много перепробовал ). щас вот друг зашел с пузырём, мож чет до утра придумаем;)
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    litrovith
    Надеюсь на вас. В масме существует возможность управлять обработкой макроса в зависимости от прохода(вроде в 6.1 была эта возможность), тоесть например не давать компилятору раскрывать макро, пока все метки нормально не определит ?
     
  15. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    вобщем вот, по дороге прихватил, 1,2. За два прохода масм не осиливает... хотя хз(я сантехник)Clerk, помоему дело именно в масме (замечал раньше глюки подобного рода). а кто что думает по етому поводу?
     
  16. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    1 читал уже много раз. 2 посмотрю спасибо.
    Ладно если макросы не работают тогда вернусь к началу. Вот принцип:
    Код (Text):
    1. CPU_EXTENSION_PREFIX macro
    2.     BYTE 0FFh, 0FFh ;Invalid opcode
    3. endm
    4.  
    5. ;"Clear trap flag"
    6. ;Очищает флаг TF.
    7. clt macro
    8.     CPU_EXTENSION_PREFIX
    9.     BYTE 01
    10. endm
    11.  
    12. ;"Set trap flag"
    13. ;Взводит флаг TF.
    14. stt macro
    15.     CPU_EXTENSION_PREFIX
    16.     BYTE 02
    17. endm
    18.  
    19. [...]
    Это простейшие инструкции, в которых нет параметров. Но как составлять более сложные ?
    Хотел красиво(как тотже условный переход) сделать. Никак.. в принципе можно и в хекс редакторе всё собирать.. Можно вручную все поля инструкции заполнять, но тогда проблема возникает в обнаружении ошибок, например если смещение получается больше положенного, но входит в диапазон то как это проверить хз. Фасм взять - но я привык к масму, весь код мой на масме. Да и хидеры не пойдут, не хочу месяц сидеть переписывать их. Как это реализовать можно вопрос.
     
  17. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Clerk
    По моему ты не совсем прав в отношении +1, что-то подсказывает мне, что её нужно учитывать при вычислении disp (до проверки), а не при byte disp?
    А извратиться с масмом можно так:
    Код (Text):
    1. jt macro Address:REQ
    2.    Disp = ($ - Address + 1)
    3.    db Disp shl 1    ; <- при Disp>127 это вызовет ошибку - результат не помещается в байт
    4.    org $ - 1        ; <- вернуться для затирания пробного байта
    5.    db Disp
    6. endm
    Здесь замкнутый круг - чтобы определить метки нужно скомпилить код, а для этого нужно раскрыть макросы, чтобы узнать какой размер кода они генерируют, в фасме эта проблема тоже требует изрядной пляски с бубном.
     
  18. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Y_Mur
    Большое спасибо.
     
  19. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    попробуй так
    Код (Text):
    1. jt macro Address:REQ
    2.     Disp = ($ - Offset(Address))
    3.     if Disp gt 127
    4.     .err
    5.     endif
    6.     BYTE Disp + 1
    7. endm
     
  20. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    "undefined symbol : Disp"