Макрос-парсер на fasm-е

Тема в разделе "WASM.WIN32", создана пользователем _DEN_, 30 янв 2005.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Не завалялось ли у кого-нибудь такого макроса...



    Есть дериктива file, которая напрямую втыкает бинарник в exe-шник. В моем случае это текстовый файл. Мне надо чтобы символы окончания строки были заменены нулями, тоесть текст втыкается напрямую, а последовательность 0Dh, 0Ah заменялась одним нулем.



    Есть ли у кого-нибудь такая штука, или хотя бы похожая, чтобы можно было переписать на основе существующей, т.к. с макроязыком fasm-а я не особо дружу :dntknw:
     
  2. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Зачем из пушки по воробьям стрелять?



    1. заменить 0Dh, 0Ah одним нулём.

    2. вкличить полученный файл простым file.



    Поскольку пёрла у тя нет, вот jscript, который выполнит первый пункт (имена текстовых файлов берутся из параметров командной строки)
    Код (Text):
    1.  
    2. // 0D0A_2_00.js
    3. fso = WScript.CreateObject('Scripting.FileSystemObject');
    4.  
    5. for( names = new Enumerator(WScript.Arguments); !names.atEnd(); names.moveNext() )
    6. {
    7.     filename = names.item();
    8.     if( fso.FileExists(filename) )
    9.     {
    10.         content = fso.OpenTextFile(filename).ReadAll();
    11.         fso.CreateTextFile(filename, true).Write(content.replace(/\r\n/g, '\0'));
    12.     }
    13. }
    14.  
     
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    S_T_A_S_

    Первый пункт отдельно ничего не решает. Я бы и на сях мог его написать. Хотелось бы чтобы на этапе компиляции проги файлы подключенные через какую-нить собственную директиву, скажем file_da2z, сразу бы парсились и впихивались в exe-шник, при этом на винте естественно оставаясь без изменений. Вот как это сделать?
     
  4. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    _DEN_ >




    ну и написал бы свой препроцессор, если RTFM религия не позволяет :derisive:


    Код (Text):
    1.  
    2. macro   file_da2z   filename
    3. {
    4.     local   .size, .2char, .pos
    5.     virtual at 0
    6.         file    filename
    7.         .size = $
    8.     end virtual
    9.  
    10.     .pos = 0
    11.     repeat .size
    12.         if .pos < .size - 1
    13.             virtual
    14.                 file    filename: .pos, 2
    15.                 load    .2char word from $-2
    16.                 end virtual
    17.                 if .2char = 0x0A0D
    18.                     db 0
    19.                     .pos = .pos + 2
    20.                 else
    21.                     db .2char and 0xFF
    22.                     .pos = .pos + 1
    23.                 end if
    24.         end if
    25.     end repeat
    26. }
    27.  
    28. file_da2z   "foo.txt"




    если файл не заканчивается на "0Dh, 0Ah", то последний байт будет утерян может ещё какие баги есть =)
     
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Мляяяя..!!! РАБОТАЕТ!!!! :)))))))))



    S_T_A_S_, спасибо тебе ОГРОМНОЕ!!!



    Родина Вас не забудет! :)
     
  6. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Я бы не заморачивался макросами в fasm а использовал бы perl :derisive:


    Код (Text):
    1. #!/usr/bin/perl -w
    2.  
    3.  
    4. foreach $f (<*.txt>)
    5. {
    6.     open(IN, "$f") or die "Can't open file: $!";
    7.     open(OUT, "+>_$f") or die "Can't open file out.html for writing: $!";
    8.  
    9.     while(<IN>)
    10.     {
    11.         s/\n/\0/g;
    12.  
    13.         print OUT $_;
    14.     }
    15.  
    16.     close(OUT);
    17.     close(IN);
    18. }
     
  7. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Asterix

    Мне это именно как директива препроцессора нужна. Чтобы сделал и забыл. Т.к. txt-файлы постоянно редактируются и прога постоянно перекомпилируется решает только макрос.



    S_T_A_S_

    если файл не заканчивается на "0Dh, 0Ah", то последний байт будет утерян может ещё какие баги есть =)



    Дописал твой макрос. Теперь можно заканчивать символами 0Dh, 0Ah, а можно и не заканчивать :)


    Код (Text):
    1. macro file_da2z filename
    2. {
    3.   local .size, .2char, .pos
    4.   virtual at 0
    5.     file filename
    6.     .size = $
    7.   end virtual
    8.  
    9.   .pos = 0
    10.   repeat .size
    11.     if .pos < .size - 1
    12.       virtual
    13.         file filename: .pos, 2
    14.         load .2char word from $-2
    15.       end virtual
    16.       if .2char = 0x0A0D
    17.         db 0
    18.         .pos = .pos + 2
    19.       else
    20.         db .2char and 0xFF
    21.         .pos = .pos + 1
    22.       end if
    23.     end if
    24.   end repeat
    25.   if .2char <> 0x0A0D
    26.     db .2char/256
    27.     db 0
    28.   end if
    29. }




    Вот только db .2char/256 мне не особо нравится. Можно как-то проще взять старший байт?
     
  8. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    _DEN_ >




    Можно ещё компилировать скриптом, т.е. скрипт сначала конвертит текст, а потом запускает fasm.



    >




    Конечно можно :)
    Код (Text):
    1.  
    2. db .2char shr 8 ;-)
     
  9. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    S_T_A_S_



    Ага, еще бы и в RadASM все это встроить :)



    Всплыла еще одна бага. Если в последней строке всего один символ и она не заканчивается 0Dh,0Ah, то этот самый символ проглатывается :dntknw:
     
  10. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    S_T_A_S_

    Пофиксил :) Конечный вариант:
    Код (Text):
    1. macro file_da2z filename
    2. {
    3.   local .size, .2char, .pos
    4.   virtual at 0
    5.     file filename
    6.     .size = $
    7.   end virtual
    8.  
    9.   .pos = 0
    10.   repeat .size
    11.     if .pos < .size - 1
    12.       virtual
    13.         file filename: .pos, 2
    14.         load .2char word from $-2
    15.       end virtual
    16.       if .2char = 0x0A0D
    17.         db 0
    18.         .pos = .pos + 2
    19.       else
    20.         db .2char and 0xFF
    21.         .pos = .pos + 1
    22.       end if
    23.     end if
    24.   end repeat
    25.   if .2char <> 0x0A0D
    26.     db .2char shr 8
    27.     db 0
    28.   else
    29.     virtual
    30.       file filename: .size-2, 2
    31.       load .2char word from $-2
    32.     end virtual
    33.     if .2char and 0xFF = 0x0A
    34.       db .2char shr 8
    35.       db 0
    36.     end if
    37.   end if
    38. }


    Не слишком криво? :)
     
  11. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    _DEN_

    Можно сделать короче:)


    Код (Text):
    1. macro   file_da2z   filename
    2. {
    3.     local   .size, .char, .pos, .lastc
    4.     virtual at 0
    5.         file    filename
    6.         .size = $
    7.     end virtual
    8.  
    9.     .lastc = 0
    10.     .pos = 0
    11.     repeat .size
    12.         virtual
    13.             file    filename: .pos, 1
    14.             load    .char byte from $-1
    15.             end virtual
    16.             if .char = 0x0A
    17.             if .lastc = 0x0D
    18.                     db 0
    19.             end if
    20.             else if .char <> 0x0D
    21.             db .char
    22.             end if
    23.         .lastc = .char
    24.             .pos = .pos + 1
    25.     end repeat
    26.     if .char <> 0x0A
    27.         db 0
    28.     end if
    29. }
     
  12. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Black_mirror

    Да, все работает, спасибо :)



    Вас Родина тоже не забудет! :)



    В связи с последним постом шутка родилась:



    Только ассемблерщики могут соревноваться "у кого короче" :)))
     
  13. johnfound

    johnfound New Member

    Публикаций:
    0
    Регистрация:
    12 фев 2003
    Сообщения:
    74
    Адрес:
    Bulgaria
    Хм, даже на служебном компютре если файл большой, ети макросы слишком медленные. Я тестил на "equates/user32.inc" и оно компилилось 7 секунд на 2.5GHz ЦПУ. А нельзя ли так:
    Код (Text):
    1.  
    2. macro   file_da2z       filename
    3. {
    4. local   ..size, ..data
    5.  
    6. ..data file filename
    7.  
    8. ..size = $ - ..data
    9. ..index = ..data
    10.  
    11. repeat ..size
    12.   load ..char byte from ..index
    13.   if (..char = $0d) | (..char = $0a)
    14.     store 0 at ..index
    15.   else
    16.     store ..char at ..index
    17.   end if
    18.   ..index = ..index + 1
    19. end repeat
    20. }
    21.  




    Недостаток, что символы $0а не будут вырезаться из файла.
     
  14. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    johnfound

    Это наверно связано с количеством проходов, я получил 5 секунд при трёх проходах на AMD1.2GHz, но в программе кроме моей версии макроса обрабатывающего user32.inc(у меня он 41К весит) практически ничего больше не было.
     
  15. johnfound

    johnfound New Member

    Публикаций:
    0
    Регистрация:
    12 фев 2003
    Сообщения:
    74
    Адрес:
    Bulgaria
    У меня user32.inc - 51К, а время 7.37с

    С моим макросом тот же файл: 0.144с