Выпущена версия DOOM, работающая только на mov-инструкциях
Новости Отредактировано
Один кадр обрабатывается около 7 часов, зато игра теперь не подвержена недавним уязвимостям в процессорах.
5К открытий5К показов
Разработчики инструмента M/o/Vfuscator выпустили патч для классической компьютерной игры DOOM, который позволяет скомпилировать игру без использования условных операторов и вообще каких-либо инструкций, кроме mov в языке ассемблера. Сделано это для доказательства работоспособности и применимости их инструмента. При этом не применяется никаких трюков с самомодифицирующимся кодом или подобных — всё работает честно.
Как такое возможно?
Оказывается, сама по себе инструкция mov
тьюринг-полная, а значит, с её помощью можно запрограммировать любой алгоритм, как на классических языках.
Если коротко, то суть в том, как проводить «сравнения» и затем в зависимости от результата выполнять определённую команду. Допустим, мы хотим сравнить значения A и B. Помещаем их в регистры Ri и Rj. Мы это можем сделать, у нас есть mov. Затем выполняем хитрый код:
Здесь мы интерпретируем значения 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 часов. Но в данном случае главное, что вообще работает.
5К открытий5К показов