Раскрытие ассемблера языка кода спагетти - PullRequest
17 голосов
/ 12 июня 2009

Я унаследовал 10-строчную программу, написанную на языке ассемблера 8051, которая требует некоторых изменений. К сожалению, это написано в лучших традициях кода спагетти. Программа, написанная в виде одного файла, представляет собой лабиринт операторов CALL и LJMP (всего около 1200) с подпрограммами, имеющими несколько точек входа и / или выхода, если они вообще могут быть определены как подпрограммы. Все переменные являются глобальными. Есть комментарии; некоторые верны. Нет существующих тестов и нет бюджета для рефакторинга.

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

Программа изначально была написана другой компанией, передана моему клиенту, а затем изменена девять лет назад другим консультантом. Ни исходная компания, ни консультант не доступны в качестве ресурсов.

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

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

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

Ответы [ 11 ]

0 голосов
/ 12 июня 2009

Я бы сказал, что ответ IanW (просто распечатайте его и продолжайте отслеживать), вероятно, лучший. Тем не менее, у меня есть немного нестандартная идея:

Попробуйте запустить код (возможно, двоичный) через распространитель, который может реконструировать код C (если вы можете найти его для 8051). Может быть, он определит несколько процедур, которые вы не можете (легко).

Может быть, это поможет.

...