Распутывание запутанного кода ассемблера

Начиная с InheritedB extends B, создание экземпляра InheritedB предоставляет ему атрибут val, который по умолчанию является «старым» для любого нового экземпляра класса B или подкласса.

Здесь InheritedB печатает свой собственный атрибут val, а не атрибут окружающего B.

17
задан skaffman 1 June 2011 в 20:03
поделиться

10 ответов

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

Возможно, вы даже сможете попросить кого-нибудь описать наиболее важные API (включая их подпись, возвращаемые значения и назначение) для кода. Если глобальное состояние изменено функцией, это также следует сделать явным. Точно так же начните различать функции и процедуры, а также регистры ввода / вывода.

Вы должны четко дать понять своему работодателю, что эта информация необходима, если они вам не верят, пусть они сядут с вами перед этим кодом, пока вы описываете, что вы должны делать и как вы должны это делать (обратный инжиниринг). В этом случае вам действительно поможет наличие работодателя с опытом работы в области вычислений и программирования!

Если у вашего работодателя нет такого технического образования, попросите его привести другого программиста / коллегу, чтобы он объяснил ему ваши шаги, это на самом деле покажет ему, что вы серьезно и честно относитесь к этому, потому что это реальная проблема. - не только с вашей точки зрения (убедитесь, что у вас есть коллеги, которые знают об этом «проекте»).

Если возможно и возможно, я бы также очень четко прояснил, что подрядчик (или, по крайней мере, контактирующий) разработчики / сопровождающие (если они больше не работают в вашей компании, то есть), чтобы помочь документировать этот код, было бы предварительным условием для реалистичного улучшения кода в течение короткого промежутка времени и обеспечения того, чтобы его можно было легче поддерживать в будущем.

Подчеркните, что вся эта ситуация возникла из-за недостатков в предыдущем процессе разработки программного обеспечения и что эти шаги помогут улучшить кодовую базу. Итак, кодовая база в ее нынешнем виде представляет собой растущую проблему, и все, что делается сейчас для решения этой проблемы, - это инвестиции в будущее.

Это само по себе также важно, чтобы помочь им оценить и понять вашу ситуацию: делать то, что то, что вы должны сделать сейчас, далеко не тривиально, и они должны знать об этом - хотя бы для того, чтобы оправдать свои ожидания (например, в отношении сроков и сложности задачи).

Кроме того, лично я бы начал добавлять модульные тесты для тех частей, которые я достаточно хорошо понимаю, чтобы я мог медленно начать рефакторинг / переписывание некоторого кода.

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

] Учитывая, что код составляет 10 КБ, я бы также рассмотрел возможность выделения подпрограмм в отдельные файлы, чтобы сделать компоненты более идентифицируемыми, предпочтительно с использованием оболочек доступа вместо глобальных переменных, а также интуитивно понятных имен файлов.

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

Аналогичным образом, огромные подпрограммы можно было бы реорганизовать в более мелкие, чтобы улучшить читаемость.

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

Если не финансово, может быть, вы предоставите ему соответствующие исправления?

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

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

Наличие доступа к внутренним компонентам эмулятора на самом деле также было бы отличным способом для дальнейшей проверки кода, например, чтобы найти повторяющиеся шаблоны кодов операций (скажем, 20-50 +), которые могут быть включены в отдельные функции / процедуры, это могло бы помочь еще больше уменьшить размер и сложность кодовой базы.

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

Использование таких инструментов, как dot / graphviz, для визуализации структуры последовательности инициализации и самого главного цикла ,

17
ответ дан 30 November 2019 в 11:04
поделиться

Боюсь, что волшебной пули для такого рода проблем не существует. Я считаю, что единственное решение - распечатать файл ASM, а затем уйти в тихое место и смоделировать выполнение программы построчно в уме (при записи содержимого регистров и ячеек памяти в блокнот). Через некоторое время вы обнаружите, что это займет не так много времени, как вы ожидали. Будьте готовы потратить на это много часов и выпить галлоны кофе. Через некоторое время вы поймете, что он делает, и сможете рассмотреть изменения.

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

Удачи

7
ответ дан 30 November 2019 в 11:04
поделиться

Вам не нужен особый бюджет на рефакторинг и тестирование - они экономят ваши деньги и позволяют работать быстрее - приступайте к делу. Это метод, который вы должны использовать для внесения изменений в унаследованный, унаследованный код, потому что это самый дешевый способ сделать это без «поломок».

В большинстве случаев я думаю, что есть компромисс, когда вы получаете больше качества взамен для того, чтобы тратить больше времени, но с устаревшим кодом, с которым вы не знакомы, я думаю, что быстрее проводить тесты - вам нужно запустить код перед его отправкой, верно?

1
ответ дан 30 November 2019 в 11:04
поделиться

Я делал подобные вещи пару раз. Некоторые рекомендации:

  • Начните с просмотра схемы, это должно помочь вам понять, что порты и булавки желаемые изменения воздействие.
  • Используйте команду grep, чтобы найти все вызовы, ветки, прыжки и возврат. Это может помочь понять поток и идентифицировать фрагменты кода.
  • Посмотрите на вектор сброса и таблица прерываний для идентификации основные строки.
  • Используйте команду grep для создания перекрестной ссылки для всех кодовых этикеток и данных ссылки (если ваш ассемблер инструменты не могут сделать это за вас).

Помните закон Хофштадтера: Это всегда занимает больше времени, чем вы ожидаете, даже если принять во внимание закон Хофштадтера .

Удачи.

4
ответ дан 30 November 2019 в 11:04
поделиться

Найди другую работу, серьезно! Ошибка в том, что книга «Эффективная работа с устаревшим кодом» может помочь, хотя я думаю, что она относится к устаревшему коду как к коду без модульных тестов.

4
ответ дан 30 November 2019 в 11:04
поделиться

Я знаю, это звучит безумно .... но я безработный (я выбрал неподходящее время, чтобы сказать партнеру по большинству членов семьи, чтобы он отправился к черту) и у меня есть немного свободного времени. Я бы хотел взглянуть на это. Я писал сборку для яблока] [и оригинального ПК. Если бы я мог поиграть с вашим кодом на симуляторе в течение пары часов, я мог бы дать вам представление о том, есть ли у меня возможность документировать его для вас (без проведения незапланированного отпуска). Поскольку я ничего не знаю о 8051, это могло быть невозможно для кого-то вроде меня, но симулятор выглядел многообещающим. Я бы не хотел денег на это. Этого достаточно, чтобы познакомиться с 8051 встроенной разработкой. Я же сказал вам, что это прозвучит безумно.

6
ответ дан 30 November 2019 в 11:04
поделиться

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

1
ответ дан 30 November 2019 в 11:04
поделиться

Разрежьте его на части.

1
ответ дан 30 November 2019 в 11:04
поделиться

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

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

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

0
ответ дан 30 November 2019 в 11:04
поделиться

Насколько хорошо вы понимаете аппаратную платформу, на которой работает этот код?

  • Переведен ли он в режим отключения питания (Pcon = 2) для экономии энергии Если да, то как его разбудили. (сброс или аппаратное прерывание)

  • Нужно ли подождать, пока генератор стабилизируется после включения питания, прежде чем выполнять последовательную связь

  • Переведен ли он в спящий режим (Pcon = 1)

Есть ли различные версии оборудования в полевых условиях?

Убедитесь, что у вас есть все различные варианты оборудования для тестирования.

Не тратьте время на симулятор - с ним очень сложно работать, и вам придется много предположений по поводу железа. Купите себе In Circuit Emulator (ICE) и запустите его на аппаратном уровне.

Программное обеспечение было написано на ассемблере, поэтому вам нужно выяснить, почему. т.е. - ограничения памяти - ограничения скорости

Может быть причина того, что этот код беспорядочный

Взгляните на файл ссылки для:

XDATA SPACE, IDATA SPACE и CODE SPACE:

Если нет свободного кода space, Xdata или Idata?

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

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

3
ответ дан 30 November 2019 в 11:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: