ARM SUB Инструкция Операнды - PullRequest
3 голосов
/ 15 июля 2010

Я работаю с компилятором llvm-clang, собирая простые функции C вплоть до сборки на процессоре ARMv7-A.Я пытаюсь выяснить, что делает эта инструкция.

SUB sp, sp, #65, 30

Очевидно, что в указателе стека остается место для некоторых локальных переменных, но я никогда не видел инструкции ARM SUB с четырьмя операндами.Я предполагаю, что 30 каким-то образом модифицирует # 65, но я не знаю как, и я не смог найти подробностей в Справочном руководстве по архитектуре ARM.Любые предложения?

Для любопытных, это в начале программы, которая создает 8x8 единичную матрицу целых чисел, поэтому я ожидаю, что sp должен освободить место как минимум для 8 x 8 x4 байта в стеке.

Ответы [ 3 ]

7 голосов
/ 15 июля 2010

30 - это операция поворота вправо на 65

Поворот 30 правых битов аналогичен повороту 2 левых бит, что равно умножению на 4. 65 * 4 = 260

Таким образом, это вычитает 260 из указателя стека.

4 голосов
/ 16 июля 2010

Конструкция рычага выделяет 12 битов для непосредственных значений, 8 битов для значения, а оставшиеся 4 бита являются поворотом вправо (представляющими поворотами 0 2 4 и т. Д. Мест).Поскольку 260 не могут быть представлены в 8 битах, они построены как 65 * 4.

Это распределяет непосредственные значения, доступные программисту, по всему 32-битному диапазону, а не ограничивает его значениями от 0 до 4095

.
1 голос
/ 04 января 2011

Дизассемблеры ARM иногда выплевывают константы в этом формате, поскольку 8-битная константа + 4-битное кодирование ROR позволяет кодировать некоторые значения по-разному. например 1 может быть закодирован как 1 ROR 0, 4 ROR 2, 16 ROR 4 и т. Д.

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

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