Показать сообщение отдельно
Старый 29.11.2012, 08:39   #9
troosh
Новичок
 
Регистрация: 27.01.2009
Адрес: Москва
Сообщений: 5
Поблагодарил: 12
Поблагодарили один раз в одном сообщении
Репа: 0
Цитата:
Сообщение от KVladG Посмотреть сообщение
Цитата:
в отличие от x86 там располагаются сами команды переходов, а не адреса преходов
Не очень понятно, как может быть команда перехода без адреса перехода?
Это просто ты не правильно понял: у процессоров, когда говорят "вектор прерываний", подразумевают что кроме номера этого вектора есть ещё и соответствующий адрес ячейки памяти, где храниться ссылка на подпрограмму обработчик это прерывания. В процессорах архитектуры CISC (как у x86 машин) в такой ячейки записан только адрес, для выборки которого используется дополнительное оборудование в самом процессоре. В RISC процессоре ARM, для упрощения процессора такое оборудование/логику не предусмотрели - по адресу соответствующему вектору прерывания процессор выбирает инструкцию для процессора и исполняет её (это скорее всего будет команда перехода, но может с этого место сразу же располагаться весь код обработчика прерываний).

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

Цитата:
Найти ссылку на текст невозможно при относительной адресации и не имея последовательный текст программы.
Чаще всего firmware пишут на языке C/C++, массив строк компилятором так кодируется как массив указателей на эти строки, за которым следуют сами строки разделенные нулевыми байтами. Выделяешь в IDA все текстовые строки и если они располагаются в одном массиве строк (например это перечень сообщений об ошибках), наверняка где-то рядом будут размещены указатели на эти строки. Такие указатели кодируются абсолютно, а не относительно, - в них можно выделить общую базу, которая укажет где располагается этот код при исполнении программы.

Попробуй прогнать следующий код, через online компилятор http://www.llvm.org/demo/
Код:
char * errors[] =
{
  "Ok",
  "No memory",
  "No permitions",
  "...",
};

char * error2text(int n)
{
  return errors[n];
}

Обрати внимание как кодируются строки


В прошивке они будут закодированы примерно так:
Код:
 DB "Ok",0,0
 DB "No memory",0,0,0
 DB "No permitions",0,0,0
 DB "...",0,0,0
 DW 0x600240
 DW 0x600244
 DW 0x60025C
 DW 0x600278
Теперь смотря на возрастающие адреса указателей на начало строк, можно предположить что сам код линковщиком был размещен по адресу 0x600000.

Цитата:
У всех MTK -прошивках в адресах с 00...000 до 00...0FF одинаковые коды.
Какой то смысл в этом должен быть.
Может там заголовок какой-то, шапка с данными. Начало кода ARM процессоров легко выделяется визуально в файлах прошивок по hex дампу - каждый четвертый байт 0xE0-0E5 (если только Thumb расширения их системы команд не используется). Я конкретно на прошивки MTК не смотрел.
troosh вне форума   Ответить с цитированием Вверх