Вы получаете выгоду от работы с необработанным машинным кодом, а не только на ассемблере. Например, рассмотрите возможность отправки двоичного файла по электронной почте, но с программой электронной почты, которая не знает, как декодировать вложения. Одно время несколько человек писали небольшие программы, которые могли бы декодировать остальную часть вложения, но все в программе было печатным символом. Таким образом, вы декодируете свое вложение, сохраняете тело письма как whatever.com
, а затем выполняете его. Он расшифрует вложение и напишет двоичный файл, который вы затем сможете выполнить.
Для другого примера, несколько лет назад на Fidonet была довольно простая задача: написать программу, которая просто печатает число, которое увеличивается с каждым разом, когда она запускается - но (часть, которая сделала это сложным), ей не разрешено внешние файлы или другое хранилище, чтобы сделать работу. Чтобы это не становилось слишком скучным, это также было чем-то вроде игры в гольф, хотя измеряемый размер был исполняемыми байтами, а не исходным кодом. В некоторых статьях этой задачи использовался самоизменяющийся код, который сильно зависел от того, как именно были закодированы инструкции, и тому подобное.
Глядя на секунду, я вижу, что у меня все еще есть исходный код для одной из моих попыток:
.model tiny,c
.286
.code
.startup
main proc
mov si,offset count
inc byte ptr [si]
mov al, [si]
mov bx,4090h
shr al, 4
call convert
lodsb
and al,0fh
mov byte ptr end_convert, 08bh
convert:
add al,bl
daa
adc al,bh
daa
int 29h
end_convert:
ret
db 0d6h
; mov dx, si
mov ah,3ch
xor cx, cx
int 21h
xchg bx, ax
mov dx,offset main
mov cx,offset the_end - offset main
int 21h
ret
main endp
count:
db 0
name:
db 'c.com', 0
the_end:
end
Мне лучше уйти сейчас, пока я не отвечаю за то, что у кого-то есть приступы апоплексии (надеюсь, я не слишком опоздал ...)