2013-04-19 9 views
3

В настоящее время я пытаюсь реализовать дизассемблер для ARM cortex A9, которые реализуют набор команд ARMv7.Почему существуют порядковые номера для одной инструкции в ARMv7

Для этого я использую руководство «DDI0406C_b_arm_architecture_reference_manual.pdf», который можно скачать здесь (после регистрации на сайте руки):

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.set.architecture/index.html

В данном руководстве, в части A8.8 с детали инструкций, я не могу понять, почему существует несколько кодировок для одной команды (например, A1, A2, ...), которые, похоже, реализованы с помощью ARMv7.

Кроме того, поскольку ARM cortex A9 использует большой палец-2, он также реализует кодировки A1/A2/... или только T1/T2 ...?

Я действительно прочитал все части этого руководства, связанные с кодировками, но я до сих пор не понимаю, как мы можем знать, какая кодировка используется для программы.

+0

Спасибо вам большое, все ваши ответы действительно полезны. Я не ожидал ответа так быстро. – user2299676

ответ

1

Невозможно отличить ARM и Thumb внутри потока инструкций. Вы можете решить только на основе способа вызова функции (если младший бит установлен в 1, то это большой палец, иначе рука).

Кодирование ARM довольно стабильно, вы найдете только несколько кодировок A1, BLX - пример, где дается кодировка A2, но это связано главным образом с тем, что новый ARM-ARM структурирован по-разному более старые. BL и BLX были двумя разными инструкциями, BLX был добавлен в дополнительное пространство команд (верхние 4 бита, которые обычно используются для условий, установлены на 1111, что в ARM до v5 означает «никогда не исполнять».

Для большого пальца -Encodings это разные, их много, потому что их нужно было разместить в более сжатом пространстве инструкций, на странице A6-220 есть информация о том, как решить, какая инструкция большого пальца состоит из двух или только одного полуслова.

1

Коды Axe являются рычагами, когда процессор находится в режиме arm, он будет декодировать биты, которые он находит, используя эти кодировки. Если имеется более одного A1, A2, должно быть очевидно, что для этого есть другая особенность или причина. две инструкции можно рассматривать отдельно (смотрите на чрезмерное использование mov в x86, например, у него много кодировок). Рассматривайте каждую кодировку как отдельную «инструкцию».

Тогда есть варианты Tx, это расширения большого пальца и thumb2. Большой палец - все 16 бит (bl может быть декодирован как две отдельные 16-битные инструкции), а описания, приведенные ниже, обозначают «все варианты большого пальца» или «armv4t к настоящему» или какой-то такой язык. Расширения thumb2 все 32 бит, первые 16 бит являются неопределенной инструкцией в мире палец. Они имеют больше ограничений на то, какие архитектуры поддерживают их.

Вы не сможете полностью создать дизассемблер для одного из этих процессоров по той же причине, которую вы не можете сделать для x86 или многих других процессоров (все?). Если вы предполагаете, что все инструкции - это один режим (рука или большой палец или большой палец + большой палец2), но не режим смешивания (рука + большой палец), то вы можете, потому что все фиксированная длина инструкции и вы можете просто разобрать все данные и код, и вы не будете запускать в любые проблемы. Чтобы разобрать смешанный режим, вы должны в основном эмулировать/выполнять инструкции и следовать потоку команд (так же, как набор дизассемблеров с переменной длиной слова), чтобы попытаться найти переходы, проблема здесь, конечно, переходы - это несколько инструкций при минимальной нагрузке регистр, тогда bx, который регистрируется, иногда в вычислении команд есть математика, и нет гарантии, что вычисление или загрузка адреса происходит с инструкцией перед bx. Таким образом, вы можете сделать некоторые из этого и пройти долгий путь путем разборки программы.

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

Комбинация технического справочного руководства и справочника по архитектуре расскажет вам, разрешена ли архитектура и реализация этой архитектуры (trm) режимом руки и большого пальца. Я бы предположил, что A9 поддерживает большой палец руки и большой палец2, все три.

Семейство коры головного мозга - единственное до сих пор, которое ограничено не поддерживающей рукой, а их большой палец2 широко варьируется, поскольку коры головного мозга m0 (и m1) являются armv6m, а m3 и m4 - armv7m (несколько десятков (armv6m) для многих десятков расширений thumb2 в armv7m). Существуют отдельные архитектурные справочники, специально предназначенные для вариантов -m, например armv7-m и руководства armv7-ar.

+0

Меня действительно беспокоит, что я действительно не могу правильно разобрать программу для смешивания рук и пальцев. Но теперь я удивляюсь, как эти дисассемблеры любят objdump? – user2299676

+0

В какой-то степени они обманывают, файл elf может/does (?) Содержать информацию, которая сообщает им, какие части двоичного файла являются тем, что им не нужно сортировать код из данных, руки с большого пальца и т. Д. Большинство наборов команд являются переменными так что дизассемблеры всегда имели эту проблему. mips и arm временно имели некоторый рельеф, являющийся фиксированной длиной инструкции, а затем, в свою очередь, добавляли разные наборы инструкций длины, сбивая их с нормой. –

+0

вы можете разбирать большую часть, но, как и любой другой набор команд, если все, что у вас есть, это двоичный код, возможно, будут вещи, которые вы не можете определить статически.преимуществом сегодня является большая часть кода, который генерируется компилятором, в основном чистым, поэтому менее вероятно, что есть ловушки дизассемблера. –

2

Различные кодировки инструкции выполняют функционально разные вещи.

Одним из примеров использования различных кодировок является A8.9.12 ADR

Эта команда добавляет непосредственное значение к значению PC для формирования PC-относительный адрес, и записывает результат в регистр назначения.

Если инструкция кодируется как A1, то смещение должно интерпретироваться как ноль или положительное, если оно кодируется как A2 тогда смещение является отрицательным.

Другим примером является A8.8.132 POP

Если список содержит более одного регистра, инструкция собран с кодированием A1. Если список содержит ровно один регистр, команда собирается для кодирования A2.

Я могу представить себе разные POP кодировок созданы, вероятно, для создания различных микрокодов по причинам производительности.

Для второй части вашего вопроса Cortex-A9 является процессором архитектуры ARMv7-A и поддерживает все инструкции, указанные в указанном вами руководстве. Может быть, вы также должны прочитать Cortex™-A9 Technical Reference Manual.

+0

Хороший, краткий ответ. Nitpick: Cortex-A9 не поддерживает _all_ инструкций, определенных в Справочном руководстве по архитектуре; он не поддерживает эти инструкции, введенные VFPv4/AdvSIMDv2 и расширениями виртуализации. – unixsmurf