|
|
  |
Обнаружил глюк в дизассемлер AVR Studio, Не правильно дизассемлит 2-х словные команды lds sts |
|
|
|
Sep 13 2008, 09:34
|
Участник

Группа: Новичок
Сообщений: 24
Регистрация: 9-09-08
Пользователь №: 40 090

|
Взял HEX. Дизассемблировал его с помощью AVR Studio. А потом опять откомпилировал. В результате получил HEX отличный от исходного. Анализ показал, что студия в командах lds и sts младший байт адрес обнуляла. Хотя в исходном HEX-е эти байты отличны от нуля. Короче, пришлось ручками править анализируя разницу в исходном и полученном HEX-ах
|
|
|
|
|
Sep 13 2008, 09:42
|
Местный
  
Группа: Свой
Сообщений: 374
Регистрация: 6-09-05
Из: Тирасполь, Приднестровье
Пользователь №: 8 294

|
Цитата(MacGregor @ Sep 13 2008, 12:34)  Взял HEX. Дизассемблировал его с помощью AVR Studio. А потом опять откомпилировал. В результате получил HEX отличный от исходного. Анализ показал, что студия в командах lds и sts младший байт адрес обнуляла. Хотя в исходном HEX-е эти байты отличны от нуля. Короче, пришлось ручками править анализируя разницу в исходном и полученном HEX-ах  Ты проведи еще один показательный эксперимент. Возьми англо-русский и русско-английский переводчики. Попробуй перевести фразу с русского на английский и потом обратно!!! Вот это как раз достойная тема будет для обсуждения!!!
|
|
|
|
|
Sep 13 2008, 09:52
|
Участник

Группа: Новичок
Сообщений: 24
Регистрация: 9-09-08
Пользователь №: 40 090

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

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(Flasher @ Sep 13 2008, 13:42)  Попробуй перевести фразу с русского на английский и потом обратно!!! Нет уж звиняйте! ассемблер-дизассемблер - это даже не компилер-декомпилер, там всё однозначно должно быть. Ибо ассемблер - это тот же машинный код, только записанный мнемониками. Насчёт языков - справедливо, если бы речь шла о переводе с СИ (к примеру) на пасколь или фортран
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Sep 13 2008, 11:47
|
Участник

Группа: Новичок
Сообщений: 24
Регистрация: 9-09-08
Пользователь №: 40 090

|
Цитата(Flasher @ Sep 13 2008, 14:23)  выкладывай пример, можно маленький. дабы народ проверил и перепроверил. Пжалуста Пароль на rar-архив: electronix
Сообщение отредактировал MacGregor - Sep 13 2008, 11:49
|
|
|
|
|
Sep 13 2008, 11:54
|
Участник

Группа: Участник
Сообщений: 55
Регистрация: 17-04-08
Пользователь №: 36 850

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

Группа: Новичок
Сообщений: 24
Регистрация: 9-09-08
Пользователь №: 40 090

|
Цитата(Nick_Shl @ Sep 13 2008, 15:54)  Ага, щаз! Это справедливо только если все команды обладают одной длинной и расположены всегда по адресам кратным этой длинне. В противном случае надо дизассемблировать программу проходясь по всем переходам. А теперь представте такую вещь: вставляем переход на середину двух-трех-и т.д. байтную команду, но который никогда не выполняется. Откуда дизассемблер будет про это знать? Такая лажа дизассемблируется... Да я в курсе про это.. Но в том-то всё и дело, что он дизассмит команды правильно, а адреса в них почему-то вычисляет не верно
|
|
|
|
|
Sep 13 2008, 15:18
|
Участник

Группа: Новичок
Сообщений: 24
Регистрация: 9-09-08
Пользователь №: 40 090

|
Цитата(_Pasha @ Sep 13 2008, 18:57)  Ето штатный прием нае обмануть дизасм.  А вменяемый дизасм должен, напоромшись на таблицу переходов или ret посреди процесса, сдаться и оставить куски non-resolved кода в .db/.dw В том числе отгрести неправильные команды на границах пройденных участков кода. Грубо говоря, "правильный" дизасм должен дизасмить не последовательно идя от ячейки к ячейке, а следуя за командами перехода начиная от точки входа в программу после сброса. Т.е. фактически дизасм должен выполнять программу попутно заполняя в результате этого выполнения некую структуру данных, называемую "восстановленный исходник". Хотя дизасм можно легко обмануть если переход совершается командой ijmp. Дизазм не сможет определить куда конкретно было передано управление Ну это мы отвлеклись и в дебри полезли.. А я же говорю о том, что Атмеловский дизассемлер допускает ошибки в простейшей вешчи. А именно. Не может правильно посчитать (или правильно записать?) адрес в 4-х байтовых командах LDS и STS. Вот апчём речь.
Сообщение отредактировал MacGregor - Sep 13 2008, 15:20
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|