Нативный код / Интерактивный разбор / Чтение: 20 мин
DX-Ball: слышно ли, с какой стороны находится кирпич?
Исследуйте функцию стереопанорамы DX-Ball с REA. Проследите инструкции и константы, попробуйте звуковую демонстрацию и проверьте восстановленный расчёт.
На этой странице
01. Попробуйте перед разбором
Нажмите «Слева», затем «Проиграть короткий тон». Повторите справа. Теперь установите масштаб −1: позиция не изменится, а звук перейдёт на другую сторону. Масштаб 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 / 1 | 0 | В центре |
| 321 / 1 | 1 | Усечение положительного значения |
| 640 / −1 | −500 | Обратный масштаб |
| 640 / 20 | 10 000 | Численный результат выходит за диапазон предпрослушивания |
Сохраните оба файла в одной папке. Запустите проверки с Node.js; устанавливать пакеты не требуется.
node check-case-labs.mjs07. Что действительно проверено?
3 205 сравнений с исходным x86 и 63 совпавших байта — результаты исходного проекта для одной функции. Этот сайт проверяет отдельную арифметическую реализацию на той же документированной сетке позиций и масштабов по эталону с рациональными числами. Он не запускает DXBALL.EXE, не воссоздаёт игру целиком и не воспроизводит её звуковой движок.
Записанные результаты численных тестов этого сайта →
Источники: Отчёт REA об исследовании DX-Ball · Поддерживаемая функция панорамы в зафиксированной версии. Руководство, иллюстрации и браузерные эксперименты созданы независимо.
Впервые используете инструмент? Что такое REA? · Как мы проверяем руководства