В общем как то очень давно видел на одном форуме была такая тема, обсуждали задачку а задачка такая: нужно написать программу, которая выводит "Hello world!" (без кавычек и со знаком !) и при этом занимает 16 байт! Командную строку использовать нельзя! Насколько помню на том форуме так и не додумался никто.. Я тоже сам пытался, ничего умного так и не придумал.., а тут недавно вспомнил про нее и решил запостить сюда.. кстати, тот человек, что придумал это клялся что это возможно сделать! вот уж незнаю..
Хм.. Из 16 байт 12 занимает строка. 4 байта на её вывод? Под Win32 это выглядит невозможным. DOS (tiny)?
Может найдешь в этом топике http://www.wasm.ru/forum/index.php?action=vthread&forum=10&topic=5579&page=1#13
Вот, не 16 байт конечно, но в w2k работает Code (Text): ;============================================= format pe console include '%fasminc%\win32a.inc' ;============================================= push eax push esp push 12 call @F db 'Hello world!' @@: push 7 call [WriteFile] ret ;============================================= data import library kernel32,'kernel32.dll' include '%fasminc%\apia\kernel32.inc' end data ;=============================================
да, DOS и Tiny, все по минимуму! тут так просто не решишь, думаю нужно кодировать каждый символ несколькими битами или как то так.. честно говоря, если без шуток, реально сложная задачка..
Ну хорошо, для простоты предположим, что каждый символ закодирован 4мя битами (для простоты декодера), таким образом получим 6 байт на текст. вывод символа в ДОС (как я понял) стОит 6 байт. Итого 12. Остаётся 4 байта на декодер, причём 2 из них уйдёт на команду перехода.
не, наверное, это невозможно в дос/вин32, так как из двух оставшихся байт на "декодер" потребуется как минимум один байт на культурное завершение программы и некий терминатор или счетчик символов, не менее 4 бит, итого - на декодер - 1 нибл в форте тоже не получится - минимум 15 байт шитого кода, но нужно еще 2 байта на команду завершения слова, не считая 3 байт на вызов интерпретатора... я встречал в программах со собственными процедурами вывода код вроде следующего: Code (Text): call print db "Hello world!",0 ... ; продолжение, можно ret print: pop si @@: lodsb test eax,eax jz @F call emit_char jmp @B @@: jmp [si] если программой считать верхний код, тогда как раз укладываемся не, все равно 17 байт...
Не совсем в топик, но тоже интересно. Программа, выводящая командную строку. 11 байт. http://www.assembly-journal.com/viewarticle.php?id=19&layout=html
Ramakrishna а можно ещё ослабить условие: Code (Text): вывод программы включает строку "Hello world!" ?
если серьёзно, то IMHO следует попытаться использовать строку (или её части) как исполняемый код, возможно самомодифицирующийся.
а вот что нам Гугл сказал : 1) 19 байт решение : start: hello db 'HellO WORLD!$' mov dx,si mov ah,9 int 21h но здесь используется "SI при старте =100h" 2) некто заявил, что при старте BP=09XX, т.о. получая mov dx,si xchg ax,bp int 21h и это только 18 при уйме доп.ограничений P.S. Строка изменена чтобы прийти с правильным выравниванием к первой команде программы без прыжка на нее.
Может использовать в качестве части слова - имя исполняемого .com файла. Например WORLD.COM, правда точку придется заменять!$, так что экономии мало. Само имя файла вроде в PSP можно отыскать.
решение с форума fasm. Оригинально =) сама программа hello.com: 4 байта mov ah,0Ah int 21h текстовый файл text.txt, содержащий "Hello world!": 12 байт запускаем так: hello.com < text.txt hello.com + text.txt = 16 байт =)
Мой вариант выводит испорченную строку H llo world! Но зато 19 байт и завершает программу. Code (Text): B409 mov ah,09h BA0601 mov dx,0106h E948FF jmp 0FF50h 6C insb es:[di],dx 6C insb es:[di],dx 6F outsw dx,ds:[si] 20776F and byte ptr [bx+6F],dh 726C jb 0000007C 642124 and word ptr fs:[si],sp _1508606853__hw.com