Самый маленький мой hello world, занимал 2 байта: "EB 80", зато ему надо было скормить некую хитрую командную строку. . Прыжков в 1 байт не бывает (кроме RET - но это просто выход, программа так и не напишет строку на экран), поэтому меньше сделать вроде как нельзя. Или у кого-то есть 1-байтовый вариант который реально выводит строку на экран??? Эх помнится году так в 1992 я этим всем увлекался, коллекционировал, что-то сам писал... Было дело, надо только архивы найти... Вот например, самовыводящаяся программа из ascii-символов: VZNNXPH555750K4PP5DM3D01D0X5AC3D21D2XP559550K4 (ввести одной строкой в .com и запустить) Кто сможет короче?
Nothing WinXP - из под cmd не работает, из под command работает, и добавляет значек в конец <font size=9>☻</font><!--size-->. Весьма впечатляет однако.
Тот на 133 не пашет под NT2k (после user32 надо .dll добавить), в аттаче чей-то на 188 - кажется везде работает 216448326__HELLO_imp4.ASM
2GPcH в Hex Workshop (там есть классная фича - просмотр структур) bogrus пытался добавить, без увеличения размера не получается
bogrus Получиось работает? правда, пришлось урезать сообщение... P.S. пока код писал, столкнулся с проблемой: почему jmp [xxxxx]; не заменяет call [xxxxx]; ret; ? не пойму, вроде должно же работать..ю _780209599__HelloW.exe
Стек "ломается", если запушить ещё адрес возврата перед вызовом MessageBox, то параметры в стеке станут на свои места и все сработает, типа такого: Код (Text): push 0 mov eax,Hi push eax push eax push 0 push @f jmp [MessageBox] @@: ... ; ret Но это фигня ещё больше места займет, если RET надо сократить, то 3 байта можно получить таким способом (2B это у тебя расстояние от Hi, который уже в eax до MessageBox): Код (Text): 0040004E FF50 2B CALL [EAX+2B] 00400051 90 NOP 00400052 90 NOP 00400053 90 NOP 00400054 C3 RETN
Печать строки "Hello World!" в 16 байт без использования командной строки Если нельзя использовать командную строку то надо использовать переменные среды окружения В окружении устанавливаем ручками в командном интерпретаторе set 0=Hello World! и выводим его следующим кодом 16 байт! Код (Text): .model tiny .radix 16 .286 .Code org 2c Envir label word .Startup mov ax,Envir push ax pop ds mov si,3 NextChar: lodsb int 29h test al,al jnz NextChar @@Ret: ret end С уважухой Андрей Бертыш
Но на этом трюки не исчерпываются! Можно дожать до 13 байт превратив переменную окружения в строку вида "Hello World!$" и изменив программу Код (Text): C:\>debug -a100 0B28:0100 push [2c] 0B28:0104 pop ds 0B28:0105 mov si,2a 0B28:0108 mov ah,9 0B28:010A int 21 0B28:010C ret 0B28:010D Правда в таком варианте размера программа утрачивает своё главное свойство - правдоподобие Но и это ещё не всё Можно не использовать командную строку и переменные среды окружения у нас остается резерв для трюков в лице расширения операционной системы Вешаем свой обработчик на загрузчик EXEC который при условии отсутствия командной строки может выполнять следующие действия Класть в psp строку вида "Hello World!$" настраивая на неё DX и помещая в регистр ah,9 вся программа печатающая эту строку Код (Text): int 21h ret 3 байта Класть тем же образом в момент загрузки программы в некое psp по смещению 0 код печатающий "Hello World!$" вот вся программа в результате которой на экране появляется строка "Hello World!" Код (Text): ret 1 байт Туда же операционная система расширяется таким образом что если ей передают программу размером в 0 байт без парамеров командной строки, то надо вывести на экран строку вида "Hello World!" Код приводить не буду