Цитата:
Сообщение от 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К не смотрел.