GUI application, анализирующее командную строку. Требует указания 3-х параметров: файл-источник, файл-приёмник и переменная. Преобразует любой файл в формат: переменная db xxh,... Запущенная с недостаточным количеством параметров, отображает справочный MessageBox. Данные объявляются в шестнадцатиричном формате, по 16 байт в строке. Скачать можно здесь.
в дистрибутиве ufmod ( http://ufmod.sf.net/ ) есть более продвинутая утилита eff, которая конвертирует во множество форматов
Ага, тут справка. Eff конвертирует в формат db для разных *асмов, а также C и Pascal. Имеет дуальный интерфейс - GUI и CUI. Есть версии для Win32, Linux и Unix. Хотя её прямое назначение - обработка xm файлов, ничто не мешает обрабатывать любой другой тип. В принципе, можно убрать дополнительные функции, связанные с xm, и зарелизить отдельную версию.
Если написать правильный командный файл, то fasm тоже прекрасно справляется с этой задачей: Код (Text): ;@echo off ;if _%3==_ goto inf ;if exist %0.bat copy %0.bat %2 > nul ;if exist %0.cmd copy %0.cmd %2 > nul ;if exist %0 copy %0 %2 > nul ;echo bin2db '%3','%1' >> %2 ;fasm %2 %2 > nul ;goto end macro dig [d] { common db '$' forward if d>9 db d+'A'-10 else db d+'0' end if } macro bin2db n,f { local .size,.ch,.pos virtual at 0 file f .size = $ end virtual .pos = 0 db n repeat .size virtual at 0 file f:%-1,1 load .ch byte from 0 end virtual if .pos and 15 db ',' else db 9,'db ' end if dig .ch shr 4,.ch and 15 .pos=.pos+1 if .pos and 15 else db 13,10 end if end repeat if .pos and 15 db 13,10 end if } ;:inf ;echo usage: %0 src_file dst_file var_name ;:end
Alexander77 смысл такой утилиты? Ставишь винхекс, на нужном месте хекс-дамп, правой кнопкой и копировать как иходники на си или паскале, Си-исходники понимает фасм!
EvilsInterrupt чтобы не делать так: Alexander77 спасибо за прогу. пожелания (как опция): вместо db использовать dd. при этом сохращается объём генерируемого файла, но нужно переворачивать дворд, что в общем-то, не проблема
А зачем dd, если не всегда размер файлов не всегда кратен 4? Вот обновлённая версия, которая выводит hex-значения в виде 0xxh, даже, если ноль спереди и не нужен... зато красивее! Скачать.
Alexander77 Последние 3, 2 или 1 байт можно вывести через db. Jupiter Идея интересная! Black_mirror На больших файлах будет сильно тормозить, но сама идея - супер!
Мне было нужно, чтобы программа обрабатывала командную строку, чтобы её можно было использовать в bat-файлах. Не зная, что есть уже именно то, что мне нужно (утилита eff, о которой здесь сообщили Asterix и Quantum), решил написать свой вариант «велосипеда». Пусть кому-то пригодится.
Alexander77 На asmcommunity есть ещё "велосипеды". Поэтому имеет смысл учитывать пожелания потенциальных пользователей, чтобы свой "велосипед" чем-то выделялся.
Учту, конечно же, но это же не самоцель, так, просто инструмент, написаный для собственных нужд в течение дня. Я сейчас заканчиваю более-менее серьёзную программу из сферы беопасности (не компьютерной).
Quantum Решил выводить двойными словами и считывать из файла блоками. Тестировал на файле размером 1120К. Если читать по 4 байта получилось 23 секунды. По 8 байт - 13 секунд. По 16 - 8. По 32 - 5 секунд. Но смысла в этом мало, так как фасм может включать в программу бинарные файлы, а masm от 3 метров dd наверно помрёт Код (Text): ;@echo off ;if _%3==_ goto inf ;if exist %0.bat copy %0.bat %2 > nul ;if exist %0.cmd copy %0.cmd %2 > nul ;if exist %0 copy %0 %2 > nul ;echo bin2db '%3','%1' >> %2 ;fasm %2 %2 > nul ;goto end macro dig d,[s] { local .c common db '$' forward .c = (d shr s) and 15 if .c>9 db .c+'A'-10 else db .c+'0' end if } macro bin2db n,f { local .size,.c0,.c1,.c2,.c3,.c4,.c5,.c6,.c7,.pos virtual at 0 file f .size = $ end virtual .pos = 0 db n repeat .size/32 virtual at 0 file f:.pos,32 load .c0 dword from 0 load .c1 dword from 4 load .c2 dword from 8 load .c3 dword from 12 load .c4 dword from 16 load .c5 dword from 20 load .c6 dword from 24 load .c7 dword from 28 end virtual db 9,'dd ' dig .c0,28,24,20,16,12,8,4,0 db ',' dig .c1,28,24,20,16,12,8,4,0 db ',' dig .c2,28,24,20,16,12,8,4,0 db ',' dig .c3,28,24,20,16,12,8,4,0 db 13,10,9,'dd ' dig .c4,28,24,20,16,12,8,4,0 db ',' dig .c5,28,24,20,16,12,8,4,0 db ',' dig .c6,28,24,20,16,12,8,4,0 db ',' dig .c7,28,24,20,16,12,8,4,0 db 13,10 .pos=.pos+32 end repeat repeat .size-.pos db 9,'db ' virtual at 0 file f:.pos+%-1,1 load .c0 byte from 0 end virtual dig .c0,4,0 db 13,10 end repeat } ;:inf ;echo usage: %0 src_file dst_file var_name ;:end
Black_mirror Eff читает блоками по 1К, но пишет блоками по 16. Если воспользоваться советом Jupiter , то на каждую строчку должно поместится до 32 байт, т.е. можно будет писать блоками по 32 байта и скорость от этого вырастет, а размер дампа уменьшится. Пробовал до 2,5Мб - масм нормально переваривал, но долго.
Вот, вроде финальная версия, 1.4f. Предыдущие версии удалены во избежание путаницы. По выбору, создаёт hex либо в формате asm (0##h), либо в формате C (0x##). А что касается чтения записи, то у меня читается весь файл целиком, а затем в памяти так же целиком создаётся output файл, который затем и пишется. Просто, по-моему, нет практической необходимости конвертить файлы в несколько гиг размером, так как такой файл создаётся, чтобы включить его потом в exe-шник. А раз так, то read once/write once а) работает быстрее, б) проще в реализации байт на 100.