Инструментарий Ghidra, некорректный декомпилированный адрес для относительных скачков с микроконтроллером AVR8

Я новичок в Ghidra toolkit и пытаюсь проанализировать прошивку для микроконтроллера AVR8 (а точнее - для ATmega8535). Ghidra в некоторых случаях генерирует неправильный адрес для команд относительных переходов RJMP/RCALL, когда вычисленный адрес находится "вне" адресного пространства программы - это произошло потому, что (как я понимаю) Ghidra для AVR8 использует 24-битную аритметику для вычисления адреса.

Пример: адрес (0xfffc48) для команды RCALL (вызывающая процедура SUB_code_fffc48) вычислен неправильно, текущий адрес 0x441, смещение в команде RCALL равно 0x806 (это отрицательное значение), поэтому Ghidra получил (с использованием 24-битной арифметики) конечный адрес 0x441 + 0xFFF806 + 1 = 0xFFFc48 который находится за пределами адресного пространства программы для ATmega8535 (на самом деле адресная шина для этого MCU - 12 бит), правильный адрес - 0xc48. Ghidra пометил эту строку ошибкой "Адрес не в памяти" ("Не удалось выполнить процесс дизассемблирования в несуществующую память с кодом:fffc48 (поток из кода:000441)")

     code:00043f a0 30           cpi        Xlo,0x0
     code:000440 19 f0           brbs       LAB_code_000444,Zflg
     code:000441 06 d8           rcall      offset SUB_code_fffc48

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

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

Спасибо олех

0 ответов

Другие вопросы по тегам