fasm(preprocessor) match/строки/...

Тема в разделе "WASM.ASSEMBLER", создана пользователем Smile, 8 май 2006.

  1. Smile

    Smile New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2004
    Сообщения:
    129
    Возникли некоторые вопросы, нужно подкрепление.



    1) Создать идентификатор в имени которого присутствует значение вычисляемое препроцессором



    macro makename name {

    index = 0

    name#index = 'x'

    }



    makename _test

    display _test0 ; undefined symbol _test0



    2) Рекурсивниые выражения



    macro parse str {

    ;взять первый символ из строки

    match c tail,str \{

    display c

    ;обработать оставшиеся символы

    parse tail ; extra characters on line "parse=b=c"

    \}

    }



    parse a=b=c



    3) Посимвольно обработать строку



    ;Получается только заранее известный символ

    match +,+ {}



    ;или из заряда isalnum

    match c tail,1+1 {}

    ;а еще и не совпадает если так

    match c tail,1 {}
     
  2. pas

    pas New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2003
    Сообщения:
    330
    Адрес:
    Russia
    В первом случае тебе нужно указывать код символа, который ты добавляеш.
    Код (Text):
    1.  
    2. macro makename name {
    3. index = 30h
    4. name#index = 'x'
    5. }
     
  3. Smile

    Smile New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2004
    Сообщения:
    129
    pas

    В первом случае тебе нужно указывать код символа, который ты добавляеш



    Как это поможет если вместо значения index подставляется текст "как есть"?



    macro makename name {

    index = 30h

    name#index = 'x'

    }



    makename _test

    display _testindex ; определяется _testindex
     
  4. IceStudent

    IceStudent Active Member

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

    Он имеет ввиду, что после name#index должен получиться идентификатор, который должен быть из печатаемых символов. А у тебя получится 'name',0 = 'x'
     
  5. Smile

    Smile New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2004
    Сообщения:
    129
    pas

    IceStudent

    Товарищи, рискну повторится, вовремя конкатерации строк переменная index не заменяется на значение, тоесть чтобы я ни присвоил будет подставлен текст "index".



    Возможно я туплю, но может черкнете рабочую строчку кода?
     
  6. pas

    pas New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2003
    Сообщения:
    330
    Адрес:
    Russia
    Работает вот такое, но не думаю, что тебе подойдет:
    Код (Text):
    1.  
    2. macro makename name {
    3. _inf fix 0
    4. name#_inf=0
    5. }      
    6.  


    makename t

    получаем t0
     
  7. IceStudent

    IceStudent Active Member

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

    Нет, думаю, ему нужно именно вычисляемое значение, я не нашёл, как сделать это вычисление. В масме, кстати, можно:
    Код (Text):
    1. index = 0
    2. mn macro nam
    3.     %echo @CatStr(nam,%index)
    4.     @CatStr(nam,%index) equ 1
    5.     index = index + 1
    6. endm
    7.  
    8. mn test
    9.  
    10. mn test
    11.  
    12. .ERRNDEF test0
    13. .ERRNDEF test1
    14.  
     
  8. Smile

    Smile New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2004
    Сообщения:
    129
    С обработкой символов в стиле "forc" туго, хотя через директивы "load/store" кое-что получается


    Код (Text):
    1.  
    2. macro Parse string
    3. {
    4.  p_start = $
    5.  p_offset = $
    6.  db string,0
    7.  p_end = $-p_start
    8.  
    9.  while p_offset < p_end
    10.   load char from p_offset
    11.   display char
    12.   p_offset = p_offset+1
    13.  end while
    14. }
    15.  
    16. Parse 'bla'
    17.  
     
  9. dead_body

    dead_body wasm.ru

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





    я ответил на форуме фасма, но не слишком ясно.

    при в ходе в макрос, как бы срабатывает директива purge на сам макросю Вот пример:


    Код (Text):
    1.  
    2. macro mov p1,p1
    3. {
    4.     ;здесь как бы purge mov
    5. ;--------------------
    6.     то есть здесь тебе надо опять определить макрос mov.
    7.     это само легко сделать, если ты вынесеш mov в   отдельный файл и подключеш его здесь.
    8. include "mov.inc"
    9. здесь если ты будеш использовать mov то вызоветься то что ты подключил.
    10. ...
    11. здесь тебе надо отменить подключение mov,поэтому делай purge mov.
    12. ;--------------------
    13.     ;а здесь снова mov macro восстановление..
    14. }
    15.  


    то есть макросы в фасме работают в виде стека.



    по 3 и 1 вопросу отвечу, как появиться время.
     
  10. Smile

    Smile New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2004
    Сообщения:
    129
    dead_body

    Спасибо, кое-что уже получается, но выглядит просто ужасно.



    Что-то пропало желание продолжать, а может задачу взял не по зубам(или инструмент). Хотел написать обработку регуляргых выражений препроцессором, и простенких грамматик(рекурсивный спуск) но сразу столкнулся с довольно серьезными ограничениями.

    А вообще я наверное поторопился, ослепленный фаразами типа "чего на фасме только не сделаешь", а вот что будет это ой как нелегко часто умалчиваю :))



    http://board.flatassembler.net/topic.php?t=5242

    http://board.flatassembler.net/topic.php?t=5241
     
  11. dead_body

    dead_body wasm.ru

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

    фасм постоянно развиваеться.

    То что ты хочеш, будет реализовано в фасме 2, если это не шутка :). Или если Томас задокументирует всё что фасм может. Вообщем надо учить всё, что есть сейчас для фасма, и ждать новых версий. Он может почти всё, просты мы не можем понять, как он это может.