Выпущена версия DOOM, работающая только на mov-инструкциях

Один кадр обрабатывается около 7 часов, зато игра теперь не подвержена недавним уязвимостям в процессорах.

Разработчики инструмента M/o/Vfuscator выпустили патч для классической компьютерной игры DOOM, который позволяет скомпилировать игру без использования условных операторов и вообще каких-либо инструкций, кроме mov в языке ассемблера. Сделано это для доказательства работоспособности и применимости их инструмента. При этом не применяется никаких трюков с самомодифицирующимся кодом или подобных — всё работает честно.

Как такое возможно?

Оказывается, сама по себе инструкция mov тьюринг-полная, а значит, с её помощью можно запрограммировать любой алгоритм, как на классических языках.

Если коротко, то суть в том, как проводить «сравнения» и затем в зависимости от результата выполнять определённую команду. Допустим, мы хотим сравнить значения A и B. Помещаем их в регистры Ri и Rj. Мы это можем сделать, у нас есть mov. Затем выполняем хитрый код:

mov [Ri], 0
mov [Rj], 1
mov Rk, [Ri]

Здесь мы интерпретируем значения Ri и Rj (т.е. A и B) как адреса и записываем в них 0 и 1. Если значения были одинаковые, то и адрес будет одинаковый, и он перезапишется. В итоге в Rk будет 1, если A=B, и 0 в другом случае. Почему нам не важно, что было по адресам Ri и Rj — читайте в подробном разборе, для нас это сейчас не имеет значения.

Затем мы можем поместить по некоторому адресу N одну инструкцию, а в следующую ячейку памяти N+1 — другую. И выполнить ту, что по адресу N+Rk. Вот мы и получили аналог условного выполнения инструкций, но используя только mov. Осталось только перевести весь код в такую форму, а в самом конце добавить безусловный переход на начало программы.

Более детально изучить, как это работает, можно по презентации, слайдам или текстовому описанию в PDF.

Зачем это нужно?

В некотором роде подобные схемы уже реализуются в RISC-архитектуре. Иначе говоря, идея не новая и позволяет выпускать более простые компиляторы и процессоры, которые по этой причине могут работать быстрее и быть дешевле. Кроме того, такой код защищён от недавних уязвимостей в процессорах просто по определению, т.к. в нём нет спекулятивного выполнения инструкций.

Для авторов M/o/Vfuscator сборка DOOM только через mov-инструкции нужна для доказательства работоспособности их метода. Работает, правда, всё очень долго — один кадр рендерится около 7 часов. Но в данном случае главное, что вообще работает.

Наши тесты для вас:
Тест на знание сленга веб-разработчиков.
Кто вы во вселенной Звёздных Войн?
А вы точно программист?