383 байта: минимальное Windows-приложение на ассемблере
HelloAssembly The smallest possible complete Windows application
Репозиторий HelloAssembly от PlummersSoftwareLLC содержит рекордно компактные версии полноценного Windows-приложения: с оконным циклом, заголовком, кнопками управления и выводом текста. Размеры варьируются от 1104 байт (MASM32) до 383 байт (Yasm с рукописным PE-заголовком). Авторы делятся техниками оптимизации, включая слияние секций и использование Crinkler, и предупреждают, что антивирусы могут принимать такие бинарники за вредоносное ПО.
Пожалуйста, сохраняйте читаемость и комментируйте свои действия — и чем меньше, тем лучше!
- rfgplk
«Наименьшее возможное» — это ровно одна инструкция; возможно, 0xc3 [ret] или 0x90 [nop]; проблема в том, как вы определяете «полноценное Windows-приложение», потому что ответ действительно зависит от того, хотите ли вы сделать его совместимым с ABI. Но ничто не мешает вам создать собственный загрузчик/исполнитель, который читает чистый бинарный файл, отображает его как исполняемый и запускает.
- abcd_f
Наименьшая осмысленная программа для MS-DOS составляла ровно 2 байта:
FA F4
Это CLI HLT, который фактически блокировал машину. Её нужно было сохранить как .com-файл, очевидно, а не как .exe.
- ggerules
Windows и ассемблер — интересная тема!
Поиск по словам «Windows» и «assembly language» выдаёт всевозможные книги. Та, что побудила меня изначально исследовать эту тему (1993 года).... [0]
Для более современного подхода к ассемблеру и Windows.... в комплекте с исходным кодом для IDE. Книга Рэя Сейфарта [1].
[0] Windows Assembly Language & Systems Programming: Object Oriented & Low-Level Systems Programming in Assembly Language for Windows 3.X
[1] Introduction to 64 Bit Windows Assembly Language Programming: Fourth Edition
ISBN-13: 978-1543138849, ISBN-10: 1543138845
- delta_p_delta_x
Интересно обойти CRT и работать напрямую с Windows API. Тем не менее, эти программы полагаются на USER.32.DLL и KERNEL32.DLL, которые выполняют основную тяжёлую работу.
Это немного похоже на «наименьший hello world на ассемблере», но код просто настраивает соглашение о вызовах, а затем передаёт завершающуюся нулём строку в `write`. Круто, но это можно было бы сделать и более прямолинейно на C. Многое в ассемблере (включая код в связанном репозитории) — это бухгалтерия для соглашения о вызовах платформы.
- haunter
Тем временем в мире Unix вы можете опуститься до 45 байт https://www.muppetlabs.com/~breadbox/software/tiny/teensy.ht...