Нативный код / Интерактивный разбор / Чтение: 20 мин

DX-Ball: слышно ли, с какой стороны находится кирпич?

Исследуйте функцию стереопанорамы DX-Ball с REA. Проследите инструкции и константы, попробуйте звуковую демонстрацию и проверьте восстановленный расчёт.

На этой странице

01. Попробуйте перед разбором

Нажмите «Слева», затем «Проиграть короткий тон». Повторите справа. Теперь установите масштаб −1: позиция не изменится, а звук перейдёт на другую сторону. Масштаб 0 помещает его в центр. Число выше — восстановленный расчёт; звук ниже — иллюстрация.

Эксперимент со стереопанорамойИГРАЙТЕ / НАБЛЮДАЙТЕ / ОБЪЯСНЯЙТЕ
X НА ЭКРАНЕ 320ЦЕЛОЧИСЛЕННАЯ ПАНОРАМА 0
Л
П

trunc((320 × 1.5625 − 500) × 1) = 0

Используйте наушники, чтобы слышать положение. Звук включается только по нажатию кнопки воспроизведения.

Численное правило соответствует отчёту. Звук — нормализованная иллюстрация Web Audio, а не исходный звуковой движок.

Что вы создадите

Функцию преобразования позиции в панораму, звуковую иллюстрацию и план сравнения воссозданной функции с исходным машинным кодом.

Перед исследованием

Для лаборатории пригодятся наушники. Чтобы повторить исследование бинарного файла, нужны ваш английский исполняемый файл DX-Ball 1.07 и провайдер анализа нативного кода. В отчёте указаны хеш цели и записанные данные. Настроить REA →

02. Проследите путь от попадания в кирпич до вызова звука

Начните с видимого события: на одной стороне экрана разбивается кирпич. Проследите путь назад от вызова звука и определите значение, передаваемое вызывающей функцией. Число, похожее на координату, может оказаться индексом плитки, смещением или масштабированной позицией.

Перед повторным использованием адресов сверьте точный выпуск с отчётом исходного проекта. Указанная вспомогательная функция начинается с 0x406400. Если ваш исполняемый файл отличается, найдите соответствующее поведение, не предполагая, что адрес тот же.

Скопируйте этот запрос для исследования
Исследуй с REA мой соответствующий исполняемый файл DX-Ball 1.07. Начни с вспомогательной функции панорамы из официального отчёта и изучи её вызов при попадании в кирпич. Объясни, как вызывающая функция формирует аргумент. Укажи инструкции в месте вызова и загрузку входа в функции. Не считай сигнатуру декомпилятора полной.

03. Если псевдокод потерял аргумент, читайте инструкции

Декомпилятор может выдать короткое и малоинформативное тело, даже когда машинные инструкции доступны. Изучайте вместе загрузку из стека, операции с плавающей точкой, используемые данные и преобразование в целое. Запросите исходные байты каждой константы, включая тип и порядок байтов.

Документированный расчёт — trunc((x × 1.5625 − 500) × scale). Вызывающая функция передаёт горизонтальную позицию. Обратите внимание на преобразование в конце: усечение к нулю важно для отрицательных значений и отличается от округления вниз.

  • Где входное значение поступает в функцию?
  • Какие байты декодируются в каждую константу с плавающей точкой?
  • Масштаб — это параметр, сохранённое состояние или фиксированный литерал?
  • Преобразование усекает, округляет, насыщает или переполняется на проверяемом диапазоне входов?

04. Осторожно превратите число в звук

Сначала реализуйте численную функцию и проверьте левую, центральную и правую позиции. Затем добавьте соседние позиции, дающие дробь. При x = 319 и scale = 1 исходное значение равно −1.5625, а целочисленный результат — −1. Округление вниз ошибочно даст −2.

Наша звуковая кнопка передаёт pan / 500 в стереопанораму Web Audio и ограничивает предпрослушивание диапазоном −1…1. Так легко услышать направление; это не воспроизведение кривой громкости DirectSound или звука исходной игры. Отображаемое целое число не ограничивается.

Скопируйте этот запрос для исследования
Независимо реализуй документированный расчёт панорамы по позиции. Проверь x = 0, 1, 319, 320, 321 и 640 при масштабах 0, 0.5, 1, 20 и −1. Сохрани преобразование к нулю. Создай предпрослушивание тона по действию пользователя, отдельно обозначь нормализацию и никогда не выдавай ограничение предпрослушивания за восстановленное численное поведение.

05. Что доказывают 3 205 успешных проверок

Проект сообщает о сравнении 641 целочисленной позиции при пяти настройках масштаба с исходной функцией x86. Отдельно он сообщает о совпадении 63 байтов компилятора в указанной исторической среде. Это разные проверки: совпадение поведения на выбранных входах и совпадение сгенерированного машинного кода.

В собственном исследовании сохраняйте каждую пару входов и оба выхода. При несовпадении сведите его к минимальному неудачному примеру. Пытайтесь добиться побайтового совпадения только после явного указания версии компилятора, параметров и обработки релокаций. Наши тесты JavaScript проверяют документированную арифметику; они не повторяют сравнение с исходным бинарным файлом.

06. Сравните известные результаты

Используйте их как явные контрольные точки. Совпадение подтверждает это небольшое правило, но не совместимость всего приложения.

X на экране / масштабЦелочисленная панорамаПочему это важно
0 / 1−500Левый край
319 / 1−1Усечение отрицательного значения
320 / 10В центре
321 / 11Усечение положительного значения
640 / −1−500Обратный масштаб
640 / 2010 000Численный результат выходит за диапазон предпрослушивания

Сохраните оба файла в одной папке. Запустите проверки с Node.js; устанавливать пакеты не требуется.

Терминал
node check-case-labs.mjs

07. Что действительно проверено?

3 205 сравнений с исходным x86 и 63 совпавших байта — результаты исходного проекта для одной функции. Этот сайт проверяет отдельную арифметическую реализацию на той же документированной сетке позиций и масштабов по эталону с рациональными числами. Он не запускает DXBALL.EXE, не воссоздаёт игру целиком и не воспроизводит её звуковой движок.

Записанные результаты численных тестов этого сайта →

Источники: Отчёт REA об исследовании DX-Ball · Поддерживаемая функция панорамы в зафиксированной версии. Руководство, иллюстрации и браузерные эксперименты созданы независимо.

Следующий экспериментПочему 200 + 10% равно 220? →

Впервые используете инструмент? Что такое REA? · Как мы проверяем руководства