2015-08-28 11 views
2

Я пишу дизассемблер ARMv7. Способы переключения между режимами ARM и Thumb четко описаны в справочном руководстве ARM, но откуда вы знаете, в каком режиме запускается программа ?Как узнать, работает ли режим ARM или Thumb в точке входа программы

Я использую Xcode, который скомпилирован для большого пальца по умолчанию, поэтому я знаю, что все мои собственные программы начнутся в Thumb, если я не буду принудительно компилировать в режим ARM. Но я хотел бы иметь возможность выполнить произвольный исполняемый файл mach-o и узнать режим набора инструкций в начале кода.

Есть ли где-то в заголовке mach-o, который задает инструкцию, установленную в точке входа?

+0

Это может зависеть от того, является ли начальный адрес четным или нечетным. –

+0

@RossRidge ты имеешь в виду полуслова? шахта начинается по адресу, выровненному по слову –

+0

Я имею в виду даже или нечетное.Инструкции BX/BXL переключаются в режим ARM и Thumb в зависимости от того, является ли адрес четным или нечетным. –

ответ

6

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

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

+0

счетчик программ не является нечетным, lsbit не установлен. Значение, поданное на одну из инструкций, которые могут переключать режимы (bx, pop, and armv7 - массив других), имеет набор lsbit, lsbit отключается, когда он направляется в счетчик программ и по существу потребляется бит T в cpsr. –

2

Большинство операционных систем вставляют немного кода перед точкой входа вашего приложения, а также поддерживают C Runtime. Они запустит ваше приложение в любом режиме, в котором написан код. Затем этот код будет изменяться по мере необходимости при вызове в вашу основную() или другую точку входа.

В случае iOS, который, как я полагаю, вы используете для таргетинга, поскольку вы используете Xcode, этот код находится в /usr/local/lib/crt0.o в вашем каталоге SDK для iOS. Разборка его показывает, что символ start является кодом ARM. То есть приложения iOS всегда запускаются в режиме ARM, но они могут изменить режим очень рано.

0

зависит от того, что вы подразумеваете под точкой входа. и ответ находится в этом определении. Операционная система должна иметь определение, потому что оно должно быть в правильном режиме. так что либо операционная система всегда будет определять режим руки, например, а затем код может переключиться, если он захочет. Или если вы используете формат файла, такой как эльф с точкой входа, тогда вы МОЖЕТЕ уйти с четным адресом, являющимся рукой, а нечетным адресом является большой палец, соответствующий команде bx/blx.

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

Если вы просто пытаетесь разобрать какой-то общий файл объекта, то вы, возможно, не сможете это понять. визуально, как человек, смотрящий на двоичный бит руки в гексагоне, когда вы видите много 0xE (начало каждого слова), которое, вероятно, представляет собой код руки, 0x6 или 0x7 и не много 0xE или ни одного (каждое полуслова), то это, вероятно, большой палец код. но это не то, на что вы можете положиться на эту задачу, поскольку первые несколько команд, вероятно, будут переключаться между режимами, если произойдет переход.

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