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, но разные наборы команд или режимы.