|
Адреса векторов прерывания |
|
|
|
Mar 31 2012, 13:55
|
Местный
  
Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199

|
Привет всем! Есть устройство на микроконтроллере MSP430F149. Из этого микроконтроллера слита прошивка и дизассемблирована с помощью IDA. Далее, перейдя в область памяти где хранятся адреса векторов прерывания, я определил адреса процедур обработки этих прерываний. И тут я увидел, что некоторые вектора указывают не на команды микроконтроллера, а просто на данные в памяти. Например, возьмем вектора прерываний асинхронных приемо-передатчиков. Только вектор URXIFG1 указывает на область памяти с инструкциями микроконтроллера. Остальные указывают на область памяти, где инструкций нет. Объясните, пожалуйста, что это значит? Может просто IDA не распознала инструкций?
P.S. Устройство может принимать и отправлять данные через RS485 или через оптический порт, то есть, как я понимаю, хотя бы у одного передатчика должны быть "активны" оба вида прерывания. И еще в устройстве есть несколько микросхем памяти, в которые (и из которых) микроконтроллер пишет (читает) данные.
|
|
|
|
|
Apr 2 2012, 07:22
|
Участник

Группа: Участник
Сообщений: 24
Регистрация: 24-01-12
Пользователь №: 69 858

|
d7d1cd, В принципе для 485го вполне достаточно только прерывания по RX (даже в двухстороннем режиме). А вы можете показать код инициализации вашего USARTа ? И желательно кусочек схемки как включена ваша интерфейсная микросхема 485 ? (в часности 2,3,4 пины куда подключены если у вас ADM485 стоит или её аналог).
|
|
|
|
|
Apr 2 2012, 07:45
|

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

|
Цитата(d7d1cd @ Mar 31 2012, 17:55)  Только вектор URXIFG1 указывает на область памяти с инструкциями микроконтроллера. Остальные указывают на область памяти, где инструкций нет. Покажите, что конкретно там лежит и на что указывает. Случаем, не FFFF? Если да, то это просто неиспользованный вектор
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Apr 2 2012, 14:41
|
Местный
  
Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199

|
Вот таблица векторов прерывания: Код 0000FFE0 00 12 34 21 A0 B8 C8 B8 00 12 00 12 00 12 FC 14 0000FFF0 F4 B8 1E B9 00 12 00 12 00 12 00 12 E0 14 00 12 Далее привожу куски кода из IDA, куда указывают вектора обоих USART-ов: USART1 transmit (0xB8A0)Код seg000:0000B8A0 .byte 4 seg000:0000B8A1 .byte 12h seg000:0000B8A2 .byte 54h; T USART1 receive (0xB8C8)Код seg000:0000B8C8 push.w R4 seg000:0000B8CA mov.b &byte_914, R4 seg000:0000B8CE cmp.w #8Ch, R4 USART0 transmit (0xB8F4)Код seg000:0000B8F4 .byte 4 seg000:0000B8F5 .byte 12h seg000:0000B8F6 .byte 54h; T USART0 receive (0xB91E)Код seg000:0000B91E .byte 4 seg000:0000B91F .byte 12h seg000:0000B920 .byte 54h; T Подскажите, что это значит?
|
|
|
|
|
Apr 3 2012, 08:31
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(d7d1cd @ Apr 2 2012, 19:41)  Подскажите, что это значит? Это видимо означает, что ваша IDA плохо отрабатывает дизасемблирование для MSP430. Насколько я себе представляю два байта 0x04 0x12 с учетом little-endian представляют из себя код операции 0x1204 PUSH.W R4. Можете сами проверить, заглянув в User's Manual в таблицу Figure 3−20. Core Instruction Map, а затем глянув отписание команды PUSH в разделе 3.4.2 Single-Operand (Format II) Instructions там же.
|
|
|
|
|
Apr 3 2012, 14:33
|
Местный
  
Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199

|
Цитата(rezident @ Apr 3 2012, 12:31)  Это видимо означает, что ваша IDA плохо отрабатывает дизасемблирование для MSP430. Насколько я себе представляю два байта 0x04 0x12 с учетом little-endian представляют из себя код операции 0x1204 PUSH.W R4. Можете сами проверить, заглянув в User's Manual в таблицу Figure 3−20. Core Instruction Map, а затем глянув отписание команды PUSH в разделе 3.4.2 Single-Operand (Format II) Instructions там же. Спасибо за помощь. Скорее всего, вы правы. Используемый вектор, например, начинается с этой команды... Можно Вас попросить дать ссылку на эти документы. И еще такой вопрос: в MSP все команды занимают 2 байта?
Сообщение отредактировал d7d1cd - Apr 3 2012, 14:54
|
|
|
|
|
Apr 3 2012, 15:00
|
Профессионал
    
Группа: Свой
Сообщений: 1 210
Регистрация: 24-01-05
Из: Россия Волгодонск
Пользователь №: 2 134

|
Цитата(d7d1cd @ Apr 3 2012, 18:33)  Спасибо за помощь. Скорее всего, вы правы. Используемый вектор, например, начинается с этой команды... Не подскажите, какую версию IDA использовать? Здесь дело не в IDA. Программа не может распознать данные это или программа, если на эти адреса нет ссылок из программы. Дизаасемблер потому и называется интерактивным, что работает совместно с оператором. Просматривая дизассемблированный текст, в нужныж местах, по адресам векторов прерываний, установите вид данных Code и повторите дизассеблирование. Просмотрите листинг на предмет "ереси" програмного кода" это могут быть таблицы данных или векторов. Некоторые подпрограммы могут вызываться через таблицы, тогда их коды могут быть неправильно восприняты IDA как данные. В общем дизассемблирование это некоторый вид искуства. Влоб дизассемблируются только простейшие программы, без хитростей и приемов защиты от взлома. Это касается любого процессора. Поищите книги Касперского по IDA многое прояснится.
|
|
|
|
|
Apr 3 2012, 15:34
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(d7d1cd @ Apr 3 2012, 19:33)  Можно Вас попросить дать ссылку на эти документы. Все основные документы (User's Guide, Datasheet, Errata) есть на страничке продукта на сайте производителя (TI). Цитата(d7d1cd @ Apr 3 2012, 19:33)  И еще такой вопрос: в MSP все команды занимают 2 байта? А вы не хотели бы краткое изложение всего руководства пользователя?  Может вначале вы сами User's Guide почитаете? Вот даже в переводе на русский.
|
|
|
|
|
Apr 3 2012, 16:32
|
Местный
  
Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199

|
Цитата(MaslovVG @ Apr 3 2012, 19:00)  Здесь дело не в IDA. Программа не может распознать данные это или программа, если на эти адреса нет ссылок из программы. Дизаасемблер потому и называется интерактивным, что работает совместно с оператором. Просматривая дизассемблированный текст, в нужныж местах, по адресам векторов прерываний, установите вид данных Code и повторите дизассеблирование. Просмотрите листинг на предмет "ереси" програмного кода" это могут быть таблицы данных или векторов. Некоторые подпрограммы могут вызываться через таблицы, тогда их коды могут быть неправильно восприняты IDA как данные. В общем дизассемблирование это некоторый вид искуства. Влоб дизассемблируются только простейшие программы, без хитростей и приемов защиты от взлома. Это касается любого процессора. Поищите книги Касперского по IDA многое прояснится. Спасибо большое! Все получилось. Я установил курсор на адрес вектора прерывания, нажал кнопку Convert to instruction и вуа-ля! Там где раньше дизассемблер показывал данные, появились инструкции процессора, где в самом конце стоит команда reti, то есть возврат из прерывания.
|
|
|
|
|
Apr 4 2012, 02:53
|
Местный
  
Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199

|
Цитата(MaslovVG @ Apr 3 2012, 21:12)  Это только начало. Необходимо найти все таблицы и все данные. Иначе после добавления даже одной команды после обратной трансляции программа будет неработоспособной. Тем паче в таких программах как правило встроен контроль целоности. После сброса программа зачастую производит контроль кода по контрольным суммам. Скажите, а что значит таблицы? Как я понимаю, это места в памяти, где указаны начальные адреса процедур. Тогда одна из таблиц - вектора прерываний. А могут быть еще какие-то?
|
|
|
|
|
Apr 4 2012, 03:23
|
Профессионал
    
Группа: Свой
Сообщений: 1 210
Регистрация: 24-01-05
Из: Россия Волгодонск
Пользователь №: 2 134

|
Цитата(d7d1cd @ Apr 4 2012, 06:53)  Скажите, а что значит таблицы? Как я понимаю, это места в памяти, где указаны начальные адреса процедур. Тогда одна из таблиц - вектора прерываний. А могут быть еще какие-то? С точки зрения ветвления таблицы могут иметь разную структуру. Простейшая вектотра как адреса. Иногда код команды и исполнительнай адрес. Но существуют и таблицы чисто данных. Таблицы линеаризации, стандартные сообщения, коэффициенты фильтров. Их вид определяеся используемыми библиотеками и предпочтениями автора программы. Обычно на начало таблицы (реже конец) IDA ставит метку. Я в этих случаях ищу место где эти данные используюся (IDA деёт соответствующий список ссылок) и разбираюсь с этим куском программы. При обнаружении векторов адресов присваиваю им символьные имена. (для обеспечения в дальнейшем возможности модификации) P.S Еще маленькая хитрость. Если на ячейке следующей за командой RET или безусловного перехода нет метки это явный признак что не все дизассемблировано верно. С такими местами нужно разбиратся особо.
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|