Слияние сегментов в фасм

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

  1. xRom2

    xRom2 New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2011
    Сообщения:
    63
    Я так понимаю он это делать не хочет ни в какую, тогда может как-то можно извратиться и собрать строковые константы в сегменте данных? Директива equ позволяет создавать растущий список, но она выполняется до условного ассемблирования и не дает собрать только строки, а заносит все аргументы макроса, включая регистры и переменные. Как так сделать?
     
  2. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    xRom2
    Сами-то поняли, о чём спросили? :) Вроде все слова знакомые, но от меня суть как-то ускользает.
     
  3. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    Нужно сложить все строки в одно место, включая строки из расширенного варианта invoke?
    Upd: ага, почти.

    Конкретно по коду с фасмофорума – например, так:
    Код (Text):
    1. abc@list equ
    2.  
    3. macro abc [s] {
    4.   forward
    5.     local abc@arg
    6.     if s eqtype ''
    7.       push abc@arg
    8.     else
    9.       push s
    10.     end if
    11.     abc@list equ abc@list,s|abc@arg
    12. }
    13.  
    14. macro def [x] {
    15.   forward
    16.     match a|b, x \{
    17.      if a eqtype ''
    18.        display 'String: "',a,'"',0x0d,0x0a
    19.        b db a,0
    20.      end if
    21.     \}
    22. }
    23.  
    24. abc 'foo',eax,1,'bar',1.0
    25. abc 'yet another',dword[eax+ebx*4]
    26.  
    27. match abc@list@,abc@list {
    28.   def abc@list@
    29. }
     
  4. xRom2

    xRom2 New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2011
    Сообщения:
    63
    Ну вот смотрите, сейас приходится делать так:
    macro abc {
    local _s
    if s eqtype '1'
    jmp @f
    _s db s
    @@: push _s
    }
    Тогда как в тасме можно было переключить сегмент, определить данные и вернуться в кодовый сегмент, и данные не будут мешаться с кодом.
     
  5. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
  6. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    xRom2
    Так и не понял, достаточно ли "переключения сегмента как в тасме" или нужно неявно собирать все строки. Если первое, то вот.
    В любых местах кода между iglobal и endg объявляются инициализированные данные, а между uglobal и endg соответственно неинициализированные. Чтобы потом включить собранные данные в бинарник, в соответствующих местах тыкаются IncludeIGlobals и IncludeUGlobals.
     
  7. xRom2

    xRom2 New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2011
    Сообщения:
    63
    Спасибо за беспокойство, но мне нужны были только строки, соответственно так как эта проблема изящно не решается буду пока пихать их в код. Пока томас не разведется и не добавит для секций аттрибут что-то типа мерджейбл :)
     
  8. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    xRom2
    Этого не будет. Но предположим, он добавил такой атрибут. Как тогда выглядит объявление строки?
     
  9. xRom2

    xRom2 New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2011
    Сообщения:
    63
    Ну придется самому написать, он-то исходники отдал.

    Примерно так:
    Код (Text):
    1. .data
    2. _s db s
    3. .code
    4. push _s
     
  10. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    xRom2
    Ну так и чем это лучше того, что я предложил?
    Код (Text):
    1. iglobal
    2.     _s db s
    3. endg
    4. push _s
     
  11. xRom2

    xRom2 New Member

    Публикаций:
    0
    Регистрация:
    25 апр 2011
    Сообщения:
    63
    Простотой реализации только если. Мой проект стал компилироваться вчетверо медленнее. Слишком высокая плата за подобное удобство. Но все равно спасибо.
     
  12. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    xRom2
    Ясно. Я сначала решил, что может нужно что-то в таком духе:
    invoke MessageBox,NULL,<string "Hello, world!",0>,<string "Title",0>,MB_OK
    , что, кстати, тоже довольно просто реализуется.