Исполняемые эмодзи: программа для x86 из одних смайликов

· Курьёзы
Автор ретро-блога MartyPC обнаружил, что UTF-8-байты большинства эмодзи складываются в валидный машинный код 8088 — и написал на «эмоджиассемблере» программу, печатающую «HELLO».

cover.svg

Всё началось с случайного наблюдения. Автор баловался с собственным онлайн-дизассемблером x86 и заметил, что вставленный в адресную строку эмодзи козы 🐐 кодируется в UTF-8 как последовательность %F0%9F%90%90. Знакомым с ассемблером x86 байт 90h скажет о многом: это опкод NOP, «пустая операция». Байт F0h на процессоре 8088 — префикс LOCK, который для большинства инструкций попросту игнорируется, а 9Fh — это LAHF. Иными словами, коза целиком представляет собой корректный код: lock lahf; nop; nop.

Дальше последовал закономерный вопрос. Подавляющее большинство эмодзи в UTF-8 начинаются с байтов F0 9F, так почему бы не написать программу для 8088, используя одни только отображаемые смайлики?

Прецеденты

Идея не нова: давно известно, что исполняемые файлы можно собирать из одних печатных ASCII-символов. Самый знаменитый пример — тестовый файл EICAR, который одновременно является строкой и валидным DOS-исполняемым, печатающим предупреждение антивируса. Публиковались и крохотные ASCII-утилиты вроде терминала TCOM, которые можно было в крайнем случае набрать с клавиатуры. А вот эмодзи как машинный код, по словам автора, никто прежде всерьёз не пробовал.

«HELLO» на смайликах

Первым делом — Hello World, точнее его усечённая версия, печатающая лишь HELLO (арифметика в эмодзи — сущее мучение). Итоговая программа из 141 байта сохраняется как .COM-файл в UTF-8 без BOM и исполняется в DOSBox-X. Буквы синтезируются вручную, по одной; например, вычитание FFB8h эквивалентно прибавлению 48h — а 48h как раз ASCII-код буквы H. Одна из букв L при этом выходит зелёной: инструкция LAHF затирает регистр флагов, содержимое которого случайно оказывается видимым атрибутом цвета. Автор оставил этот глюк намеренно — как «крохотный намёк на творящийся за кулисами кошмар».

В статье приводится целый справочник — «эмоджиассемблер»: таблицы отдельных эмодзи (коза как четырёхбайтовое выравнивание, корова 🐮 как аккуратный инкремент указателя), эмодзи с «открытым хвостом», чьи недописанные байты подхватывает следующий символ, и готовые «гаджеты» с говорящими именами вроде BunnySad, PlateGoat и FrogStrap.

Загрузчик и демо на VGA

Писать так напрямую автор честно называет мучительным занятием без нормальных чисел, арифметики и переходов. Поэтому он собрал загрузчик: короткий декодер извлекает произвольные байты из «хвостов» эмодзи с помощью недокументированной особенности инструкции AAD, позволяющей задавать недесятичное основание. Эффективность упаковки — всего 25%, зато на выходе получилась полноценная VGA-демка размером 1092 байта, работающая в любом DOSBox.

На эмодзи автор не остановился: тот же трюк проделан с японской каной и корейским хангылем, тоже печатающими «Hello World». В финале он мечтательно спрашивает: а нельзя ли собрать из эмодзи целый BIOS, операционную систему или, чем чёрт не шутит, EmojiDOOM? Примеры «исполняемого Unicode» он обещает собирать в отдельном репозитории на GitHub.


Источник: Lobsters

Комментарии

Войдите, чтобы комментировать.

  • Пока нет комментариев.