Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Обнаружил глюк в дизассемлер AVR Studio
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
MacGregor
Взял HEX.
Дизассемблировал его с помощью AVR Studio.
А потом опять откомпилировал.

В результате получил HEX отличный от исходного.

Анализ показал, что студия в командах lds и sts младший байт адрес обнуляла. Хотя в исходном HEX-е эти байты отличны от нуля.

Короче, пришлось ручками править анализируя разницу в исходном и полученном HEX-ах sad.gif
Flasher
Цитата(MacGregor @ Sep 13 2008, 12:34) *
Взял HEX.
Дизассемблировал его с помощью AVR Studio.
А потом опять откомпилировал.

В результате получил HEX отличный от исходного.

Анализ показал, что студия в командах lds и sts младший байт адрес обнуляла. Хотя в исходном HEX-е эти байты отличны от нуля.

Короче, пришлось ручками править анализируя разницу в исходном и полученном HEX-ах sad.gif

Ты проведи еще один показательный эксперимент. Возьми англо-русский и русско-английский переводчики. Попробуй перевести фразу с русского на английский и потом обратно!!! Вот это как раз достойная тема будет для обсуждения!!!
MacGregor
Цитата(Flasher @ Sep 13 2008, 13:42) *
Ты проведи еще один показательный эксперимент. Возьми англо-русский и русско-английский переводчики. Попробуй перевести фразу с русского на английский и потом обратно!!! Вот это как раз достойная тема будет для обсуждения!!!

Да.. Если бы это был форум переводчиков. Но так как это форум разработчиков электроники я посчитал нужным предупредить коллег об опасности
Flasher
выкладывай пример, можно маленький. дабы народ проверил и перепроверил.
MrYuran
Цитата(Flasher @ Sep 13 2008, 13:42) *
Попробуй перевести фразу с русского на английский и потом обратно!!!

Нет уж звиняйте!
ассемблер-дизассемблер - это даже не компилер-декомпилер, там всё однозначно должно быть. Ибо ассемблер - это тот же машинный код, только записанный мнемониками.

Насчёт языков - справедливо, если бы речь шла о переводе с СИ (к примеру) на пасколь или фортран
MacGregor
Цитата(Flasher @ Sep 13 2008, 14:23) *
выкладывай пример, можно маленький. дабы народ проверил и перепроверил.

Пжалуста smile.gif

Пароль на rar-архив: electronix
VDG
Цитата(MacGregor @ Sep 13 2008, 13:52) *
я посчитал нужным предупредить коллег об опасности

галактико опасносте smile.gif
Nick_Shl
Цитата(MrYuran @ Sep 13 2008, 13:39) *
ассемблер-дизассемблер - это даже не компилер-декомпилер, там всё однозначно должно быть. Ибо ассемблер - это тот же машинный код, только записанный мнемониками.
Ага, щаз!
Это справедливо только если все команды обладают одной длинной и расположены всегда по адресам кратным этой длинне. В противном случае надо дизассемблировать программу проходясь по всем переходам. А теперь представте такую вещь: вставляем переход на середину двух-трех-и т.д. байтную команду, но который никогда не выполняется. Откуда дизассемблер будет про это знать? Такая лажа дизассемблируется...
А ещё круче самомодифицирующийся код. Но это, правда, не для AVR.
MacGregor
Цитата(Nick_Shl @ Sep 13 2008, 15:54) *
Ага, щаз!
Это справедливо только если все команды обладают одной длинной и расположены всегда по адресам кратным этой длинне. В противном случае надо дизассемблировать программу проходясь по всем переходам. А теперь представте такую вещь: вставляем переход на середину двух-трех-и т.д. байтную команду, но который никогда не выполняется. Откуда дизассемблер будет про это знать? Такая лажа дизассемблируется...

Да я в курсе про это.. Но в том-то всё и дело, что он дизассмит команды правильно, а адреса в них почему-то вычисляет не верно
Огурцов
Проблема с дизассемблером есть еще такая: при отладке выше 64k дизассемблированный код размещаяется с нулевого адреса - теряется старший бит адреса. Хотя на работу программы это не влияет, но отлаживать жутко неудобно.
_Pasha
Цитата(Nick_Shl @ Sep 13 2008, 15:54) *
Ага, щаз!
А теперь представте такую вещь: вставляем переход на середину двух-трех-и т.д. байтную команду, но который никогда не выполняется. Откуда дизассемблер будет про это знать?

Ето штатный прием нае обмануть дизасм. biggrin.gif А вменяемый дизасм должен, напоромшись на таблицу переходов или ret посреди процесса, сдаться и оставить куски non-resolved кода в .db/.dw В том числе отгрести неправильные команды на границах пройденных участков кода.
MacGregor
Цитата(_Pasha @ Sep 13 2008, 18:57) *
Ето штатный прием нае обмануть дизасм. biggrin.gif А вменяемый дизасм должен, напоромшись на таблицу переходов или ret посреди процесса, сдаться и оставить куски non-resolved кода в .db/.dw В том числе отгрести неправильные команды на границах пройденных участков кода.

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

Ну это мы отвлеклись и в дебри полезли.. А я же говорю о том, что Атмеловский дизассемлер допускает ошибки в простейшей вешчи. А именно. Не может правильно посчитать (или правильно записать?) адрес в 4-х байтовых командах LDS и STS. Вот апчём речь.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.