1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

fasm g

Тема в разделе "FASM", создана пользователем f13nd, 18 ноя 2018.

  1. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.030
    Решил тут на днях поплотней взяться за новый фасм и определиться 'г' - 'гармония' или нечто иное? Соорудил ассемблер для Renesas SH-2A под новый фасм. Все получилось и даже работает.
    Фасм теперь позиционируется как 'assembler engine' - движок, а не ассемблер. То есть синтаксис в теории может переварить любой, нужно его только научить этому.
    Что например с точкой? Точка - большое благо и большая беда фасма, как быть с директивами '.section', '.end', '.long' и прочими? Гражданин Гриштар предлагает обрабатывать каждую строку макросом '?':
    Код (ASM):
    1. macro ? ln
    2.     match =. a,ln
    3.         match =long? c,a
    4.             long c
    5.         ;...
    6.         else match =section? c,a
    7.         else match =end? c,a
    8.         else
    9.             ln
    10.         end match
    11.     else match a =: =. b,ln
    12.         a: b
    13.     else match =and? =. =b? a,ln
    14.         and_b a
    15.     ;...
    16.     else match =!,ln
    17.     else
    18.         ln
    19.     end match
    20. end macro
    Он же поможет игнорировать комментарии, обзначенные '!' (тому кто это придумал надо памятник поставить. на могиле) В этот же макрос пойдут все инструкции, содержащие точку (чтобы использовать всю мощь нового модификатора '?' и AND.B and.b одинаково хорошо работали).
    Если ассемблер на big-endian проц, то не надо свопать байты на сдвигах, это сильно замедлит обработку. Теперь для этого есть кое-что получше:
    Код (ASM):
    1. macro rsh.long a&
    2.     iterate b,a
    3.         dd b bswap 4
    4.     end iterate
    5. end macro
    Как видно из примеров, фигурные и квадратные скобки со стенами из бекслешей больше не используются, match'и else'ятся (никаких больше '=0,done'/'done equ 1'), нету больше 'common'/'reverse' - их заменил более гибкий 'iterate'. Кстати об iterate:
    Код (ASM):
    1. macro anymacro args&
    2.     iterate i,args
    3.         indx % + 1
    4.         if %=%%-1
    5.             break
    6.         end if
    7.     end iterate
    8. end macro
    с 'indx' и 'break' стало куда интересней.
    Операнды содержат запятые? Фигня:
    Код (ASM):
    1. macro rsh.operands names,args&
    2.     local a,b,c,d,displacement,register
    3.     a equ
    4.     c equ names
    5.     iterate e,args
    6.         rmatch =@( f,e
    7.             a equ e
    8.         else rmatch =@@( f,e
    9.             a equ e
    10.         else
    11.             match a,a
    12.                 b equ a e
    13.             else
    14.                 b equ e
    15.             end match
    16.             a equ
    17.             match b,b
    18.                 match f:t,c
    19.                     c equ t
    20.                     d equ f
    21.                 else
    22.                     match c,c
    23.                         d equ c
    24.                     end match
    25.                 end match
    26.                 match d,d
    27.                     display `d,' ',`b,13,10
    28.                     ;src 0xFF
    29.                     ;dst @(R0 GBR)
    30.                 end match
    31.             end match
    32.         end rmatch
    33.     end iterate
    34. end macro
    35. macro xor_b args&
    36.     local src,dst
    37.     rsh.operands src:dst,args
    38. end macro
    39. xor_b 0xFF,@(R0,GBR)
    Все поет и пляшет и с запятыми.
    'postpone' - обрабатывается после ассемблирования, позволяет избежать одних ошибок, чтобы выводить другие :mda::
    Код (ASM):
    1. postpone
    2.     local o2
    3.     o2 equ 13,10,'displacement mod 4 must be 0',13,10
    4.     if (src.disp and 11b) <> 0
    5.         err o2
    6.     end if
    7. end postpone
    Одинарную кавычку к сожалению ни 'match', ни 'rmatch' (есть и такой) корректно не обрабатывает. Можно конечно заморочиться:
    Код (ASM):
    1. macro anymacro args&
    2.     local a,v
    3.     virtual
    4.         db `args,0,0,0,0
    5.         load a dword from $$
    6.     end virtual
    7.     if (a and 0xFFFF)=0x2768 | (a and 0xFFFF)=0x2748
    8.         virtual
    9.             db `args
    10.             v = 0
    11.             repeat $ - $$ - 2
    12.                 load a byte from $$ + 1 + %
    13.                 if a>('0'-1) & a<('9'+1)
    14.                     v = (v shl 4) or (a - '0')
    15.                 else if a>('A'-1) & a<('F'+1)
    16.                     v = (v shl 4) or (a - 'A' + 10)
    17.                 else if a>('a'-1) & a<('f'+1)
    18.                     v = (v shl 4) or (a - 'a' + 10)
    19.                 end if
    20.             end repeat
    21.             ;
    22.         end virtual
    23.     else
    24.         ;
    25.     end if
    26. end macro
    Но овчина выделки не стоит. Слишком несерьезно. Так что с конструкциями типа "#h'FFFFFFFF" можно пока распрощаться. По крайней мере до тех пор, пока match не начнет их нормально обрабатывать, либо пока не появится директива 'fix', способная "#h'" махнуть на "0x". Да, 'fix' больше нету.
    Честно говоря не знаю что и подумать но вот уж это-то точно не ожидал снова увидеть:
    Код (ASM):
    1. a equ b
    2. match a,a
    3.     display `a,13,10
    4. end match
    Без этого match'а по-прежнему получается болт на 32. И не только после присвоений, если переменная содержит точку 'src.type', та же петрушка. Но это всегда была такая особенность у фасма, не зная ее далеко не уедешь.
    Появились также звезды '*' и восклицания '!' (macro wtf?!) и несколько других новых директив, которые мне не особенно нужны были. Загляните в мануал, там интересно.
    И еще один "лайфхачик". Поскольку получившийся ассемблер не нейтив, а переваривать ему иногда придется миллионы строк, неплохо бы подумать об оптимизации. Верней думать о ней полезно всегда, но я хочу предложить неожиданный фокус. У фасма 1 два процессора команд: первичный (обрабатывает директивы 'match', 'equ', 'macro', 'struc' - тупенький, обрабатывает сравнения и присвоения строк) и вторичный ('if', 'while', 'rept', и т.д. вся арифметика и логика макроязыка на нем). Первый жрет гораздо меньше памяти и работает куда быстрей второго (для фасм 1 инфа 146%), я думаю и в фасме г ситуация должна быть схожей (match'и все так же не мешаются с if'ами, работают вообще не обращая на них внимание). Есть например формат инструкции:
    Код (Text):
    1. ;ADDV Rm, Rn ;0011nnnnmmmm1111
    Номера регистров всегда кодируются как младший или старший нибл (4 бита) байта, что соответствует правому и левому символу в 16-ричном представлении байта. Что если при разборе аргументов номера регистров задавать через equ не 0..15, а 0..f? А при ассемблировании делать:
    Код (ASM):
    1. macro addv? args&
    2.     local src,dst
    3.     rsh.operands src:dst,args
    4.     match =reg =reg m n,src.type dst.type src.reg dst.reg
    5.         db 3#n#h,0#m#fh
    6.     else
    7.         err 13,10,'syntax: ',13,10,'addv Rm,Rn',13,10
    8.     end match
    9. end macro
    Получается, что инструкции, не содержащие численных констант/смещений можно кодировать одним только первичным обработчиком. А остальным форматам инструкций без обработки полей регистров тоже станет попроще. Интелу с его 3-битными полями могли бы прекрасно зайти битовые конструкции типа '11#001#010#b', правда у Томаша в х86 ассемблере такого не наблюдаю, он там на if'ах всё заколхозил. Но художнику виднее :grin:
    На "ворошиловском мегабайте" (101071 строка кода на 943465 строк вообще) за счет апчхи-мизации разница составила примерно 4 секунды, что наверное было бы здорово, если бы это было не 77 и 73 секунды соответственно. Если первая строчка содержит ошибку, то он все равно примерно столько же будет тупить, потом ошибку отдаст. Как-то медленно запрягает наверное. На файлах поменьше скорость вполне приличная.
    Вобщем инструмент достойный, эмоции вызывает в основном положительные. Если Томаш завезет базовый комплект макросов, то точно фасм 1 отправится в музей.