Сборка инструкции MULS по ARM с g cc и как - PullRequest
1 голос
/ 07 февраля 2020

У меня есть следующая инструкция в файле сборки:

MULS R0, R0, R2        

Это прекрасно собирается, используя g cc (g cc -o prog pros.s), и программа работает. Когда я использую as для сборки (как -o prog.o pros.s), я получаю:

Rd and Rm should be different in mul

Есть идеи почему?

Ответы [ 2 ]

5 голосов
/ 07 февраля 2020

Из ARM ARM

Указание того же регистра для и ранее было описано как получение НЕПРЕДУСМОТРЕННЫХ результатов. В ARMv6 нет никаких ограничений, и считается, что все соответствующие реализации ARMv4 и ARMv5 также не требуют этого ограничения, потому что высокопроизводительные мультипликаторы читают все свои операнды перед записью любых результатов

ARMv4 и ARMv5 имеют это правило / Проблема, думаю, ошибка, а не функция. ARMv6 и ARMv7 не имеют этой проблемы, поэтому проверьте параметр cpu / arch, который вы используете при компиляции, и, что более важно, какую цель вы используете.

3 голосов
/ 07 февраля 2020

Предположительно, g cc использует другой режим по умолчанию для большого пальца или режим ARM или версию архитектуры процессора по умолчанию. Используйте gcc -v, чтобы увидеть, что он передает as.

http://www.keil.com/support/man/docs/armasm/armasm_dom1361289882394.htm говорит, что Rd и Rn должны быть разными для ARM до ARMv6.

Но muls в режиме большого пальца доступен только как 32-битная инструкция Thumb2 в ARMv6T2, поэтому он всегда поддерживает использование одного и того же регистра в качестве места назначения и первого источника. Таким образом, сборка в режиме большого пальца означает, что эта форма всегда разрешена.

Если вы хотите собрать в режиме ARM, вы можете использовать as -march=armv7 или что-то еще, чтобы сказать, что целевой процессор - ARMv7 (и, следовательно, не нужен чтобы не использовать тот же регистр.)

IDK, если вы можете установить некоторые из этих вещей с помощью директив ассемблера в исходном коде.

...