Как я могу получить список допустимых кодов операций ARM от gcc (или из другого места)? - PullRequest
3 голосов
/ 17 марта 2011

Я хотел бы генерировать псевдослучайные инструкции ARM. С помощью директив ассемблера я могу сказать gcc, в каком режиме я нахожусь, и он будет жаловаться, если я попробую набор опкодов и операндов, которые не разрешены в этом режиме, поэтому он должен иметь некоторый внутренний список того, что можно сделать в каком режиме. , Где это живет? Будет ли легче извлечь эту информацию из LLVM?

Является ли этот вопрос "даже не неправильным"? Должен ли я попробовать другой подход полностью?

Ответы [ 2 ]

2 голосов
/ 17 марта 2011

Чтобы ответить на мой собственный вопрос, это на самом деле очень легко сделать с помощью arm.md и constraints.md в gcc / config / arm /. Я, вероятно, провел больше времени, отвечая на этот вопрос и отвечая на комментарии к нему, чем выясняя это. Оказывается, мне просто нужно искать 'TARGET_THUMB1', пока я не дошел до реализации thumb2.

1 голос
/ 18 марта 2011

Для семейства ARM доллар останавливается на ARM ARM (Справочное руководство по архитектуре ARM). Существует раздел набора команд ARM и раздел набора команд Thumb. В каждой из двух инструкций указывается, какое поколение (ARMvX, где X - это какое-то число, например 4 (arm7) или 5 (таймфрейм arm9) и т. Д.). Поскольку код операции и псевдокод указаны для каждой инструкции, вы должны быть в состоянии выяснить, что такое настоящая команда и, если есть, синтаксис для сохранения ввода на другой (например, push и pop).

В частности, для Cortex-m3 и thumb2 вам также необходимо ознакомиться с TRM (Техническое справочное руководство). У ARM, я забыл название, универсальный синтаксис, который они пытаются использовать, который должен работать как с Thumb, так и с ARM. Например, для ARM у вас есть три инструкции для регистрации:

add r1,r1,r2

На большом пальце есть только две операции с регистрами

add r1,r2

Желание в основном состоит в том, чтобы встретиться посередине, или, я бы сказал, более точно, чтобы побудить сборщиков ARM анализировать инструкции Thumb и кодировать их с помощью эквивалентной инструкции ARM без жалоб. Возможно, это началось с большого пальца, а не с большого пальца2. До недавнего времени я всегда разделял два синтаксиса в своем коде (и я все еще обычно использую синтаксис ARM для ARM и Thumb для большого пальца).

И затем да, вы должны увидеть, какова конкретная реализация инструмента ассемблера, в вашем случае binutils. Похоже, вы нашли секретное кольцо декодера binutils / gnu.

...