z80: Инструменты статического и динамического анализа кода.
Отчасти развивая вопрос поднятый в этой публикации, хочу спросить у вас: «какие есть 'умные' интерактивные инструменты динамического и статического анализа кода для z80 (кроме дорогущего IDA Starter/Pro)»?
И что эти «умники» умеют?
- какие (и где) есть инструменты динамического анализа кода?
к примеру, для того, чтобы получить маркировку участка исходного кода как «исполняемого», достаточно запустить программу под эмулятором, некоторое время погонять её с включенным логированием состояния регистра PC (указатель адреса исполняемой команды) — как результат получим массив адресов, по которым реально расположен исполняемый код.
Аналогично можно проанализировать и запись/чтение из адресов памяти:
- если из ячейки памяти данные только считывались — перед нами константа,
- если только записывались, а потом исполнялись — перед нами кусок самомодифицирующегося кода,
- если записывались/считывались — перед нами переменная (разрядность переменной определяется по команде считывания, возможный вид участка памяти — по способу адресации (если через индексные регистры — то, возможно перед нами массив глобальных переменных),
- перемещался ли блок памяти и откуда/куда (в каком количестве).
- логирование исполнений команд перехода (сбор для каждого исполняемого адреса с какого адреса перешли по данному адресу (если предыдущей командой была команда условного/безусловного перехода).
- какие (и где) есть инструменты статического анализа кода?
к примеру, указываем стартовый адрес блока (org #0100) — и пробегаем код (без исполнения) с анализом ветвлений: строим граф переходов, в котором каждая из команд условного перехода — вершина, параллельно помечая пройденные адреса команд как исполняемый код. Если какие-то исполняемые участки были пропущены динамическим анализом в п. 2), то тут мы получим информацию о дополнительных редкоисполняемых участках программы.
Правда при подобном анализе есть несколько (разрешимых) проблем:
анализ переходов по jp (hl), jp (sp) = ret. В случае с ret — нужен контроль за состоянием стека.
- Ну и инструмент для разбора всей этой статистики =)
И где и как это реализовано? Где и как это можно реализовать? =)
N.B.: То есть сценарий использования может быть такоей: наткнулись в дизассемблированном листинге на jp (hl) какому-либо адресу: посмотрели в статистике, собранной динамическим анализом, по каким адресам из этой инструкции осуществлялись переходы, и жить стало проще.
11 комментариев
К сожалению, сыроватый. Сколько ни пытался задизасмить кое-какие бинари, уходил в бесконечный апдейт.
А идея да, хорошая.
А ты в исходниках современных эмулей спектрума не ориентируешься? По ощущениям, куда и как проще такой сбор статистики добавить?
А вообще, все зависит от задачи. Создать AY файл по результатам исполнеия 48к снапшота и построить карту исполнения кода в расширенной памяти для нетиповой конфигурации- это две разные вещи.
Какие-то альтернативы достойные рассмотрения можешь посоветовать? =)
а вообще есть 4.5 фриварная, хотя я не юзал такое.