Как разделить инструкции ARM и данные во время дизассемблирования

Я пишу/(используя binutils) кусок кода для ручной разборки инструкций thumb2 (16bit и 32bit). Я столкнулся с проблемой различения подлинных инструкций ARM и частей DATA.

Самая большая проблема заключается в том, что инструкции не выровнены по словам. Поэтому, когда я пытаюсь прочитать 32-битную инструкцию, много раз она фактически перекрывается со следующими инструкциями.

Любая помощь, пожалуйста.

Спасибо, виджей


person user1468106    schedule 20.06.2012    source источник


Ответы (2)


Инструкции для рук всегда выравниваются по словам. большой палец всегда выровнен. thumb2 имеет переменную длину слова. и вы не можете дизассемблировать переменную длину слова так же, как фиксированную длину слова. чтобы дизассемблировать наборы инструкций переменной длины слова, вы не можете просто пройтись по памяти по выровненным адресам и дизассемблировать. В какой-то форме вы должны пройтись по данным в порядке выполнения, чтобы найти начальный адрес для каждой инструкции, а затем из этого списка вы дизассемблируете.

person old_timer    schedule 20.06.2012

Если вы также можете читать таблицу символов, GCC оставит символы $a $t $d, указывающие, по какому адресу вы должны переключить интерпретацию байтов: Arm, Thumb и Data соответственно.

Например, именно так objdump умеет отображать содержимое литеральных пулов, но не пытается сопоставить их обратно с инструкциями, несмотря на то, что они существуют между соседними функциями в секции .text.

person David Mirabito    schedule 21.11.2012