Hello World! - 16 байт
Всей группой мучаемся месяц - ничего.
Как написать:-? :-? :-?
16 байт с данными. Может применить какую-нибудь кодировку.
'48 65 6C 6C 6F 20 57 6F 72 6C 64 21'
Разница между самым большим и малым значениям выше 64 :(((
Так что можете попращаться с предыдущей мессагой... Она сюда не подходит
Вот что я порпобовал
_looplabel: mov cl,12
lodsb
int 29h
loop _looplabel
retn
Но от этого не легче.... разве что порытаться раскрыть код... но:
1. Никто не гарантирует что получиться
2. Займёт уёму времени
ОК
Вот что я порпобовал
_looplabel: mov cl,12
lodsb
int 29h
loop _looplabel
retn
Но от этого не легче.... разве что порытаться раскрыть код... но:
1. Никто не гарантирует что получиться
2. Займёт уёму времени
lodsb по умолчанию указ. на cs:0 > CD 20
т.е.
Самый короткий (на мой взгляд) вывод строки посимвольно (если мы собираемся кодировать строку, то можно использовать только посимвольный вывод):
mov si,offset Data ;3 байта
mov cl,Length ;2 байта
looping:
lodsb ;1 байт
; 1-е раскодирование
int 29h ;2 байта
; 2-е раскодирование
int 29h ;2 байта
loop looping ;2 байта
ret ;1 байт
;итого 13 байт
Допустим, что вы умудрились так закодировать строку плюс словарь к ней (если не использовать таблицу ASCII в качестве словаря), что она упряталась в этот самый код. Конечно, вероятность такого исхода очень близка к нулю, но все же допустим. Заметим, что на символ потребуется даже теоретически 4 бита, т.е. будем считать, что в одном байте два символа.Для 1-го раскодирования можно использовать разлиные манипуляции с битами, операции деления, aam и т.д. Все эти операции занимают минимум 2 байта (включая aam). Остался в распоряжении 1 байт. Затем нам нужно выполнить 2-е раскодирование. Это может быть просто перемещение остаточного результата от первого раскодирования в al. Конечно, если вы умудритесь это зделать за один байт, то все будет круто 8). Но мне кажется, что ни фига (извините) у вас не получится.
Да, и если использовать просто Hello World! в качестве кода, то тоже ничего не выдет, т.е. обязательно надо символы кодировать, чтобы подогнать к нужным нам инструкциям :).
Отсюда остается последний выход, закодировать все символы так, чтобы в закодированном виде они представляли программу, а при раскодировании Hello World! Тогда можно использовать на один символ один байт и у нас тогда целых пять байт :) на перекодировщик.
Во всех случаях получается что все коды инструкции зависимы друг от друга :), а это очень и очень редкий случай. Так что все вышенаписанное полный бред и вы вообще молодцы что дочитали до конца :D
Все это мои личные доводы и вы можете не обращать на них никакого внимания.
а где можно раздобыть справочник прерываний?
10x!
Я кажется где то встречал реализацию в которой шел просто какой-то странный способ перехода в таблицу прерываний и команда выхода из прерывания сразу закрывала и программу...
Перерыл все свои заначки но так этот способ и не нашел :-(((
.code
org 100h
s:
mov ah,9
lea dx,buf
int 21h
ret
buf db 'Hello world$'
end s
[COLOR=red]niznaju skolko wiesit![/COLOR]
.model tiny
.code
org 100h
s:
mov ah,9
lea dx,buf
int 21h
ret
buf db 'Hello world$'
end s
[COLOR=red]niznaju skolko wiesit![/COLOR]
Обалдеть, а мы то мучались :D. Ты хоть ранние посты читал? :)
Обалдеть, а мы то мучались :D. Ты хоть ранние посты читал? :)
:D :D
Lotos, когда препод обещал ответ выдать?
:D :D
Lotos, когда препод обещал ответ выдать?
Препод согласился принять такой вариант:
.model tiny
.code
org 100h
beg:
mov ah,0Ah
int 21h
end beg
4 байта
В коммандной строке: hello.com < text.txt
В text.txt содержится строка Hello World! (12 байт)
Выход из программы по Ctrl+C.
Вариант "кривой", но другой мы не придумали.
.model tiny
.code
org 100h
start:
mov dx,offset mess
mov ah,9
int 21h
ret
mess db " World!",'$'
end start
Фишка в следующем: файл называется HEllo.com (ну или asm) и когда пишешь в командной строке:
>>F:\Ishodnik\Asm\hello>Hello
он выдает:
>> World!
у меня как раз 16 байт, а если без пробела - 15 даже... хи-хи-хи...
командную строку же использовать нельзя - его слова?
ваш препод - извращенец и редкостный садист...
командную строку же использовать нельзя - его слова?
Но ведь это использование перенаправления, а не коммандной строки. Хотя по большому счету я согласен.
Но ведь это использование перенаправления, а не коммандной строки. Хотя по большому счету я согласен.
Чемто мене это байку, а может и не байку про одного студента напоменает. Опоздал он значеть однажды на лекцию, а лектор в это время задачку записивал и добавил, что она не решаема. Он значеть это всё пропустил, ну и записал её. Всю ночь мучился, но всётаки решил!
Чемто мене это байку, а может и не байку про одного студента напоменает. Опоздал он значеть однажды на лекцию, а лектор в это время задачку записивал и добавил, что она не решаема. Он значеть это всё пропустил, ну и записал её. Всю ночь мучился, но всётаки решил!
Как препод сказал, так я и написал. А мучался я не один, а весь поток (человек 120).:)
Дык че там? Когда решение препода опубликуешь?
Видя такие дела, я сразу в HIEW:
hello.com
00: B409 mov ah,009
02: BA0901 mov dx,00109
05: CD21 int 021
07: CD20 int 020
09: дальше в HEX: "Hello World!$"
т.е. без компиляторов.
ето 22 байта
ну я непробовал, но может для записи напрямую в видеопамять потребуется меньшаю прога, но судя по намекам препода - все ето фигня, надо придумать алгоритм перекодирования..
первое шо приходит в голову - просто при записи в видеопамять находу делать смещения и прибавлять расчитанное число.. ("!" можно написать отдельно) токо я непробовал :)
довольно простой алгоритм..
про перенаправление - мона обойтись и без text.txt:
echo Hello World!|hello.com
вроде так..
С Новым, кстати, Годом!
В окружении устанавливаем ручками в командном интерпретаторе
set 0=Hello World!
и выводим его следующим кодом 16 байт!
.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
:)
увидел вемку fr016, в двух вариантах: 16 байт и 11 байт, обе демки выводят красивые(относительно их размера) видеоэффекты :)
Основная фишка: использование значений регистров, которые были перед стартом проги.
48 65 6c 6c 6f 20 77 6f 72 6c 64 b4 09 ba 00 01 cd 21
17 байт (что-то не нравится в dx, надо подчистым dos):
48 65 6c 6c 6f 20 77 6f 72 6c 64 b4 09 b6 01 cd 21
а вообще это старая история про админов-програмистов, которые так развлекались. решение её - использовать математическую функцию для заполнения регистков. помоему, это было умножение (работает с ax и dx). в той истории даже решение, помоему, было. надо искать...
15 байт но вывод с мусором. Для Microsoft Windows XP [Версия 5.1.2600]
в других версиях возможно работать не будет так как используется функция по конкретному адресу 3601h +3h которая имеет вид
seg000:3604 lodsb
seg000:3605 mov cl, al
seg000:3607 xor ch, ch
seg000:3609 mov ah, 6
seg000:360B
seg000:360B loc_0_360B: ;
seg000:360B lodsb
seg000:360C mov dl, al
seg000:360E int 21h ; DOS - DIRECT CONSOLE I/O CHARACTER OUTPUT
seg000:360E ; DL = character <> FFh
seg000:360E ; Return: ZF set = no character
seg000:360E ; ZF clear = character recieved, AL = character
seg000:3610 loop loc_0_360B
seg000:3612 retn
первую стоку (mov si, 9086h) пропускаем.
И конечно нет корректного завершения задачи :)
Но можно поискать другие куски кода :)
Какую именно строку надо вывести? Или надо вывести нечто, чтобы пользователь понял что это HelloWorld?