Я так понимаю он это делать не хочет ни в какую, тогда может как-то можно извратиться и собрать строковые константы в сегменте данных? Директива equ позволяет создавать растущий список, но она выполняется до условного ассемблирования и не дает собрать только строки, а заносит все аргументы макроса, включая регистры и переменные. Как так сделать?
Нужно сложить все строки в одно место, включая строки из расширенного варианта invoke? Upd: ага, почти. Конкретно по коду с фасмофорума – например, так: Code (Text): abc@list equ macro abc [s] { forward local abc@arg if s eqtype '' push abc@arg else push s end if abc@list equ abc@list,s|abc@arg } macro def [x] { forward match a|b, x \{ if a eqtype '' display 'String: "',a,'"',0x0d,0x0a b db a,0 end if \} } abc 'foo',eax,1,'bar',1.0 abc 'yet another',dword[eax+ebx*4] match abc@list@,abc@list { def abc@list@ }
Ну вот смотрите, сейас приходится делать так: macro abc { local _s if s eqtype '1' jmp @f _s db s @@: push _s } Тогда как в тасме можно было переключить сегмент, определить данные и вернуться в кодовый сегмент, и данные не будут мешаться с кодом.
xRom2 Так и не понял, достаточно ли "переключения сегмента как в тасме" или нужно неявно собирать все строки. Если первое, то вот. В любых местах кода между iglobal и endg объявляются инициализированные данные, а между uglobal и endg соответственно неинициализированные. Чтобы потом включить собранные данные в бинарник, в соответствующих местах тыкаются IncludeIGlobals и IncludeUGlobals.
Спасибо за беспокойство, но мне нужны были только строки, соответственно так как эта проблема изящно не решается буду пока пихать их в код. Пока томас не разведется и не добавит для секций аттрибут что-то типа мерджейбл
xRom2 Этого не будет. Но предположим, он добавил такой атрибут. Как тогда выглядит объявление строки?
Ну придется самому написать, он-то исходники отдал. Примерно так: Code (Text): .data _s db s .code push _s
Простотой реализации только если. Мой проект стал компилироваться вчетверо медленнее. Слишком высокая плата за подобное удобство. Но все равно спасибо.
xRom2 Ясно. Я сначала решил, что может нужно что-то в таком духе: invoke MessageBox,NULL,<string "Hello, world!",0>,<string "Title",0>,MB_OK , что, кстати, тоже довольно просто реализуется.