Предположительно, 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, если вы можете установить некоторые из этих вещей с помощью директив ассемблера в исходном коде.