Написал утилитку типа bin2db

Тема в разделе "WASM.WIN32", создана пользователем Alexander77, 23 сен 2006.

  1. Alexander77

    Alexander77 Alexander

    Публикаций:
    0
    Регистрация:
    1 авг 2006
    Сообщения:
    28
    Адрес:
    Ukraine, Kiev
    GUI application, анализирующее командную строку. Требует указания 3-х параметров: файл-источник, файл-приёмник и переменная. Преобразует любой файл в формат: переменная db xxh,... Запущенная с недостаточным количеством параметров, отображает справочный MessageBox. Данные объявляются в шестнадцатиричном формате, по 16 байт в строке.
    Скачать можно здесь.
     
  2. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    в дистрибутиве ufmod ( http://ufmod.sf.net/ ) есть более продвинутая утилита eff, которая
    конвертирует во множество форматов
     
  3. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Ага, тут справка. Eff конвертирует в формат db для разных *асмов, а также C и Pascal. Имеет дуальный интерфейс - GUI и CUI. Есть версии для Win32, Linux и Unix. Хотя её прямое назначение - обработка xm файлов, ничто не мешает обрабатывать любой другой тип. В принципе, можно убрать дополнительные функции, связанные с xm, и зарелизить отдельную версию.
     
  4. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Если написать правильный командный файл, то fasm тоже прекрасно справляется с этой задачей:
    Код (Text):
    1. ;@echo off
    2. ;if _%3==_ goto inf
    3. ;if exist %0.bat copy %0.bat %2 > nul
    4. ;if exist %0.cmd copy %0.cmd %2 > nul
    5. ;if exist %0 copy %0 %2 > nul
    6. ;echo bin2db '%3','%1' >> %2
    7. ;fasm %2 %2 > nul
    8. ;goto end
    9.  
    10. macro dig [d]
    11. {
    12. common
    13. db '$'
    14. forward
    15. if d>9
    16. db d+'A'-10
    17. else
    18. db d+'0'
    19. end if
    20. }
    21.  
    22. macro bin2db n,f
    23. {
    24. local .size,.ch,.pos
    25. virtual at 0
    26. file f
    27. .size = $
    28. end virtual
    29. .pos = 0
    30. db n
    31. repeat .size
    32. virtual at 0
    33. file f:%-1,1
    34. load .ch byte from 0
    35. end virtual
    36. if .pos and 15
    37.     db ','
    38. else
    39.     db 9,'db '
    40. end if
    41. dig .ch shr 4,.ch and 15
    42. .pos=.pos+1
    43. if .pos and 15
    44. else
    45.     db 13,10
    46. end if
    47. end repeat
    48. if .pos and 15
    49.     db 13,10
    50. end if
    51. }
    52. ;:inf
    53. ;echo usage: %0 src_file dst_file var_name
    54. ;:end
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Black_mirror
    Интересно :)
     
  6. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Alexander77
    смысл такой утилиты?
    Ставишь винхекс, на нужном месте хекс-дамп, правой кнопкой и копировать как иходники на си или паскале, Си-исходники понимает фасм!
     
  7. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia
    EvilsInterrupt
    чтобы не делать так:
    Alexander77
    спасибо за прогу.
    пожелания (как опция):
    вместо db использовать dd. при этом сохращается объём генерируемого файла, но нужно переворачивать дворд, что в общем-то, не проблема
     
  8. Alexander77

    Alexander77 Alexander

    Публикаций:
    0
    Регистрация:
    1 авг 2006
    Сообщения:
    28
    Адрес:
    Ukraine, Kiev
    А зачем dd, если не всегда размер файлов не всегда кратен 4? Вот обновлённая версия, которая выводит hex-значения в виде 0xxh, даже, если ноль спереди и не нужен... зато красивее! Скачать.
     
  9. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Alexander77
    Последние 3, 2 или 1 байт можно вывести через db.

    Jupiter
    Идея интересная!

    Black_mirror
    На больших файлах будет сильно тормозить, но сама идея - супер!
     
  10. Alexander77

    Alexander77 Alexander

    Публикаций:
    0
    Регистрация:
    1 авг 2006
    Сообщения:
    28
    Адрес:
    Ukraine, Kiev
    Мне было нужно, чтобы программа обрабатывала командную строку, чтобы её можно было использовать в bat-файлах. Не зная, что есть уже именно то, что мне нужно (утилита eff, о которой здесь сообщили Asterix и Quantum), решил написать свой вариант «велосипеда». Пусть кому-то пригодится.
     
  11. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Alexander77
    На asmcommunity есть ещё "велосипеды". Поэтому имеет смысл учитывать пожелания потенциальных пользователей, чтобы свой "велосипед" чем-то выделялся.
     
  12. Alexander77

    Alexander77 Alexander

    Публикаций:
    0
    Регистрация:
    1 авг 2006
    Сообщения:
    28
    Адрес:
    Ukraine, Kiev
    Учту, конечно же, но это же не самоцель, так, просто инструмент, написаный для собственных нужд в течение дня. Я сейчас заканчиваю более-менее серьёзную программу из сферы беопасности (не компьютерной).
     
  13. Black_mirror

    Black_mirror Active Member

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

    Решил выводить двойными словами и считывать из файла блоками. Тестировал на файле размером 1120К. Если читать по 4 байта получилось 23 секунды.
    По 8 байт - 13 секунд.
    По 16 - 8.
    По 32 - 5 секунд.
    Но смысла в этом мало, так как фасм может включать в программу бинарные файлы, а masm от 3 метров dd наверно помрёт ;)

    Код (Text):
    1. ;@echo off
    2. ;if _%3==_ goto inf
    3. ;if exist %0.bat copy %0.bat %2 > nul
    4. ;if exist %0.cmd copy %0.cmd %2 > nul
    5. ;if exist %0 copy %0 %2 > nul
    6. ;echo bin2db '%3','%1' >> %2
    7. ;fasm %2 %2 > nul
    8. ;goto end
    9.  
    10. macro dig d,[s]
    11. {
    12. local .c
    13. common
    14. db '$'
    15. forward
    16. .c = (d shr s) and 15
    17. if .c>9
    18. db .c+'A'-10   
    19. else
    20. db .c+'0'
    21. end if
    22. }
    23.  
    24. macro bin2db n,f
    25. {
    26. local .size,.c0,.c1,.c2,.c3,.c4,.c5,.c6,.c7,.pos
    27. virtual at 0
    28. file f
    29. .size = $
    30. end virtual
    31. .pos = 0
    32. db n
    33. repeat .size/32
    34. virtual at 0
    35. file f:.pos,32
    36. load .c0 dword from 0
    37. load .c1 dword from 4
    38. load .c2 dword from 8
    39. load .c3 dword from 12
    40. load .c4 dword from 16
    41. load .c5 dword from 20
    42. load .c6 dword from 24
    43. load .c7 dword from 28
    44. end virtual
    45. db 9,'dd '
    46. dig .c0,28,24,20,16,12,8,4,0
    47. db ','
    48. dig .c1,28,24,20,16,12,8,4,0
    49. db ','
    50. dig .c2,28,24,20,16,12,8,4,0
    51. db ','
    52. dig .c3,28,24,20,16,12,8,4,0
    53. db 13,10,9,'dd '
    54. dig .c4,28,24,20,16,12,8,4,0
    55. db ','
    56. dig .c5,28,24,20,16,12,8,4,0
    57. db ','
    58. dig .c6,28,24,20,16,12,8,4,0
    59. db ','
    60. dig .c7,28,24,20,16,12,8,4,0
    61. db 13,10
    62. .pos=.pos+32
    63. end repeat
    64. repeat .size-.pos
    65. db 9,'db '
    66. virtual at 0
    67. file f:.pos+%-1,1
    68. load .c0 byte from 0
    69. end virtual
    70. dig .c0,4,0
    71. db 13,10
    72. end repeat
    73. }
    74. ;:inf
    75. ;echo usage: %0 src_file dst_file var_name
    76. ;:end
     
  14. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Black_mirror
    Eff читает блоками по 1К, но пишет блоками по 16. Если воспользоваться советом Jupiter
    , то на каждую строчку должно поместится до 32 байт, т.е. можно будет писать блоками по 32 байта и скорость от этого вырастет, а размер дампа уменьшится.

    Пробовал до 2,5Мб - масм нормально переваривал, но долго.
     
  15. Alexander77

    Alexander77 Alexander

    Публикаций:
    0
    Регистрация:
    1 авг 2006
    Сообщения:
    28
    Адрес:
    Ukraine, Kiev
    Вот, вроде финальная версия, 1.4f. Предыдущие версии удалены во избежание путаницы. По выбору, создаёт hex либо в формате asm (0##h), либо в формате C (0x##). А что касается чтения записи, то у меня читается весь файл целиком, а затем в памяти так же целиком создаётся output файл, который затем и пишется. Просто, по-моему, нет практической необходимости конвертить файлы в несколько гиг размером, так как такой файл создаётся, чтобы включить его потом в exe-шник. А раз так, то read once/write once а) работает быстрее, б) проще в реализации байт на 100.
     
  16. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    не нужно =)
     
  17. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Не качается! :dntknw:

    И

    тоже некачается
     
  18. Alexander77

    Alexander77 Alexander

    Публикаций:
    0
    Регистрация:
    1 авг 2006
    Сообщения:
    28
    Адрес:
    Ukraine, Kiev