Возникли некоторые вопросы, нужно подкрепление. 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 {}
В первом случае тебе нужно указывать код символа, который ты добавляеш. Код (Text): macro makename name { index = 30h name#index = 'x' }
pas В первом случае тебе нужно указывать код символа, который ты добавляеш Как это поможет если вместо значения index подставляется текст "как есть"? macro makename name { index = 30h name#index = 'x' } makename _test display _testindex ; определяется _testindex
Smile Он имеет ввиду, что после name#index должен получиться идентификатор, который должен быть из печатаемых символов. А у тебя получится 'name',0 = 'x'
pas IceStudent Товарищи, рискну повторится, вовремя конкатерации строк переменная index не заменяется на значение, тоесть чтобы я ни присвоил будет подставлен текст "index". Возможно я туплю, но может черкнете рабочую строчку кода?
Работает вот такое, но не думаю, что тебе подойдет: Код (Text): macro makename name { _inf fix 0 name#_inf=0 } makename t получаем t0
pas Нет, думаю, ему нужно именно вычисляемое значение, я не нашёл, как сделать это вычисление. В масме, кстати, можно: Код (Text): index = 0 mn macro nam %echo @CatStr(nam,%index) @CatStr(nam,%index) equ 1 index = index + 1 endm mn test mn test .ERRNDEF test0 .ERRNDEF test1
С обработкой символов в стиле "forc" туго, хотя через директивы "load/store" кое-что получается Код (Text): macro Parse string { p_start = $ p_offset = $ db string,0 p_end = $-p_start while p_offset < p_end load char from p_offset display char p_offset = p_offset+1 end while } Parse 'bla'
Smile я ответил на форуме фасма, но не слишком ясно. при в ходе в макрос, как бы срабатывает директива purge на сам макросю Вот пример: Код (Text): macro mov p1,p1 { ;здесь как бы purge mov ;-------------------- то есть здесь тебе надо опять определить макрос mov. это само легко сделать, если ты вынесеш mov в отдельный файл и подключеш его здесь. include "mov.inc" здесь если ты будеш использовать mov то вызоветься то что ты подключил. ... здесь тебе надо отменить подключение mov,поэтому делай purge mov. ;-------------------- ;а здесь снова mov macro восстановление.. } то есть макросы в фасме работают в виде стека. по 3 и 1 вопросу отвечу, как появиться время.
dead_body Спасибо, кое-что уже получается, но выглядит просто ужасно. Что-то пропало желание продолжать, а может задачу взял не по зубам(или инструмент). Хотел написать обработку регуляргых выражений препроцессором, и простенких грамматик(рекурсивный спуск) но сразу столкнулся с довольно серьезными ограничениями. А вообще я наверное поторопился, ослепленный фаразами типа "чего на фасме только не сделаешь", а вот что будет это ой как нелегко часто умалчиваю ) http://board.flatassembler.net/topic.php?t=5242 http://board.flatassembler.net/topic.php?t=5241
Smile фасм постоянно развиваеться. То что ты хочеш, будет реализовано в фасме 2, если это не шутка . Или если Томас задокументирует всё что фасм может. Вообщем надо учить всё, что есть сейчас для фасма, и ждать новых версий. Он может почти всё, просты мы не можем понять, как он это может.