виде инклудов (плюс магия). По мотивам всего этого возник достаточно бесполезный проект. В пакете MASM32 существует утилита bintodb, которая преобразовывает бинарные файлы в ассемблерные .inc. Делает она это самым простым и очевидным способом - db nn,nnn,n.... При этом размер файла увеличивается более чем в три раза (две десятичных цифры в среднем и запятая). Нужно написать программу, которая оптимизирует размер прилагаемого исходника так, чтобы результат компиляции не изменился.
Можно использовать: директивы db/dw/dd/dq и rb/rw/rd/rq (1), оператор dup (2), десятичные и шестандацатеричные числа (3), символьные константы вместо чисел (4), строки в одинарных и двойных кавычках. Нельзя использовать всё остальное (возможности препроцессора, другие директивы и возможности ассемблера, числа с плавающей точкой, инструкции x86 😁). Ограничения выбраны такие, чтобы не возникало искушения реализовать inflate на макроязыке фасма :)
Язык программирования любой, важен только результат. Сгенерированный ассемблерный файл должен собираться в fasm, но можно предусмотреть опциональную совместимость с masm (отличия ниже). Максимальная длина строк 110 символов, заполнение строк в среднем не менее 50% (5). В файле должны быть только переводы строк и печатаемые ASCII-символы (0x0a, 0x0d, 0x20...0x7e).
1. При использовании rb в конце файла нули не попадут в выходной файл, но исходник всё равно должен резервировать правильное количество байтов. В masm отдельных директив резервирования нет, можно использовать ? и dup(?).
2. В masm круглые скобки у dup обязательны, в fasm их можно опустить, если в списке повтора только один элемент.
3. В fasm есть шестандцатеричные числа с префиксом $. Они самые короткие, но их нет в masm.
4. dd 'ABCD' в fasm это dd 0x44434241, в masm это dd 0x41424344.
5. Как-нибудь так: (file_size / ((110 + 2) * num_lines)) * 100.
Стикер
а можно пример входных и выходных данных?
Вот компилируется .bin, потом читаешь его в программе, оптимизируешь по шаблонам максимально короткие директивы (например, 100 одинаковых значений можно заменить на dup), и записываешь куда-нибудь в выходной файл .asm.
Fasm их разворачивает
Зачем? Буду писать на питоне.
Только ассемблер.
Тогда в чат по Python скинешь.
А тебе в ответ - что это такое, дядя
Я же сказал: бесполезный проект :) Что касается питона, то можно во флудилку уйти, если интересно. Лично я считаю, что попытка реализовать это на асме без прототипа на любом высокоуровневом языке чревата годами отладки. Вот когда алгоритм будет — можно попытаться. Может даже получится обогнать какой-нибудь Си — там миллионы сравнений.
Я не на то ответил, хотел ответить ок, на написание на фасме.
ну пару простых методов(перевод на dd из db и dup вполне и без прототипа получится сделать)
Обсуждают сегодня