Как вы извлекаете значения из битов ARM ASM? - PullRequest
2 голосов
/ 05 августа 2011

В IDA Pro я вижу ARM ASM, указанный ниже. Какие биты использует IDA для получения 7200?

A3 F5 E1 53 SUB.W R3, R3 # 7200

Для удобства значения в двоичном виде следующие:

7200 = 0x1c20 = 0001 1100 0010 0000

0xA3F5E153 = 1010 0011 1111 0101 1110 0001 0101 0011

Редактировать: загрузить файл при выборе IDA. Файл Mach-O (DYLIB) ARMv7 [macho.lhc]

1 Ответ

2 голосов
/ 06 августа 2011

ARM ARM (ARM Architectural справочное руководство) является хорошим ресурсом, особенно для ARM и большого пальца кодирования инструкций. Для thumb2, хотя ищите ARMv7-M TRM (техническое справочное руководство), оба бесплатны для скачивания.

(я знаю, что начинаю это с шестнадцатеричного гекса 0x7200, а не 7200 десятичного, вот и все, в конце концов, все работает).

Sub r3, r3, # 0x7200 кодируется следующим образом (для ARM).

e2433c72 sub r3, r3, # 29184; 0x7200

E означает всегда выполнить

старшие три бита 2 указывают на немедленную обработку данных без других фиксированных битов младший бит из двух и старших 3 битов из 4 равен 0010, что означает суб. младший бит 4 - это бит s, означающий обновить флаги (был бы подчиненной инструкцией, если бы этот бит был установлен). следующие два отрывка 3 и 3 - это два экземпляра r3, следующие 4 бита, c - поле поворота, а младшие 8 бит - непосредственные.

операнд сдвига: immed_8 rotate_right (rotate_immed * 2), так что 0x72 повернуто вправо (24 бита), что равносильно вращению влево на 32-24 бита, так что получится немедленный 0x7200.

Для thumb2 (откуда берется sub.w, кодируется следующим образом:

f5a3 43e4 sub.w r3, r3, # 29184; 0x7200

кодировка T3

0xF1A00000 с некоторыми битами или без них является базовой кодировкой для SUB.W rd, rd, # const (с 12-битным непосредственным значением, T4 также имеет 12-битный immed).

Бит 0x4 в 0x5 - это бит i, и он установлен, поэтому мы должны знать, что, если бит s не установлен, он является подпрограммой, а не подпрограммой. младшие три бита в 0x .... 4 ... nibble - это поле imm3, младшие 8 бит - это поле imm8 с использованием нотации arm, наше непосредственное значение равно 1: 100: 11100100

Взятие первых пяти из этих битов, i, imm3 и верхнего бита imm8 11001

Это означает, что нужно взять битовую комбинацию 11100100 и сдвинуть ее вправо на 1001 бит

00000000011100100 ......

0000 0000 0111 0010 0 ......

и постоянная

0x00720000 он выключен на 256, надо это выяснить

Хм, я делал 0x7200, вы делаете десятичную 7200, которая, как вы упомянули, равна 0x1C20

Итак, глядя на то, что говорит ваш инструмент, инструмент говорит вам

A3 F5 E1 53

Мы знаем, что нам нужен 0xF5A3, поэтому, возможно, другая часть тоже поменялась местами.

0xF5A353E1

Что ты получишь от меня:

f5a3 53e1 sub.w r3, r3, # 7200; 0x1c20

та же кодировка t3

0xF5A3 означает sub.w что-то, r3, что-то с установленным битом i 0x53E1 означает sub.w r3, r3, что-то, а const 1: 101: 11100001

старшие 5 бит 11011 что означает сдвиг 11100001 вправо 0b1011 бит, что составляет 11

0000000000011100001000

0000 0000 0001 1100 0010 0000 0000 0000

0x001C2000

Если вы достаточно взрослый, чтобы знать Сейнфельда, это попадает в категорию йад, йад.
A5.3.2 armv7-m TRM (Модифицированные непосредственные константы в инструкциях большого пальца).

01010 они показывают как заполненные два бита (из этих пяти бит mnopq выбрасывает второй, оставляя mopq в качестве величины сдвига или 0b0010 в этом случае).

и у них есть ... другие вещи, яда яда, тогда

11111 становится сдвигом / пэдом 23 бита 11110 - это накладка 22 11101 - это пэд 21, но область между ними не линейная, там есть какая-то магия если мы продолжим работать в обратном направлении 11100 - площадка 20, 11011 - площадка 19,

И это то, что мы искали для пэда 19, перед 1 и младшим 7 битами immed8.

0x00001C20

Так что 12-битное кодирование констант thumb2 немного затруднительно, много интересных констант, которые вы можете оптимизировать. Именно этот, где установлен верхний бит imm3, оставляет вам 4 бита или 16 шаблонов / значений. но у нас есть до 24 бит, которые мы могли бы добавить, мы не можем туда добраться. По-видимому, если бит i равен нулю, вы заполняете сверху вниз, если бит i установлен, вы заполняете его от средней точки, как это выглядит.

Итак, посмотрите на инструкцию SUB в armv7 trm. Кодировка t3 соответствует тому, что вы пытаетесь сделать. в описании сказано, что значение сдвига большого пальца - это i: imm3: imm8, возьмите эти биты в разделе a.5 того же руководства и в таблице a5-1 кодировка T3 назвала его const, а не imm12, кодировка imm12 выглядит в псевдокоде после этой таблицы a5-1.

Также обратите внимание, что вы не используете инструкции ARM, а смотрите инструкции thumb2. Да, часть семейства ARM, но разные наборы команд или режимы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...