Я пытаюсь понять синтаксис записи в сборке, чтобы сначала правильно и правильно записать код. в этом примере он показывает пример использования "=r"
:: «r» vs: «= r» уточнение сборки
asm volatile ("MRS %0, PMUSERENR_EL0\n": "=r"(value));
это считывает значение регистра и сохраняет его в переменной значение. Другой пример использует ::"r"
asm volatile ("MSR PMUSERENR_EL0, %0\n":: "r"(value));
Об этом пишет значение переменной в регистр PMUSERENR_ELO. Вот еще один пример: How to measure program execution time in ARM Cortex-A8 processor?.
Когда я пытаюсь скомпилировать простой тестовый код с двумя приведенными выше командами, я получаю сообщение об ошибке: :9:2: error: output operand constraint lacks '='
Если я добавлю «=» и удалю его «:», он скомпилируется, но когда я его протещу, он просто говорит: Illegal instruction
Если кто-то мог бы объяснить разницу, которая была бы полезной, многочисленные обучающие сборники показывают тот же формат, но без объяснения. Его на 64-битной платформе, если это дает какое-либо понимание. Благодарю.
Вы уверены, что использовали два двоеточия? ('::') – Jester
См. [Этот сборник ссылок на GNU C inline asm] (http://stackoverflow.com/questions/34520013/using-base-pointer-register-in-c-inline-asm/34522750# 34522750), включая ссылки на [официальные gcc docs] (https://gcc.gnu.org/onlinedocs/gcc/Using-Assembly-Language-with-C.html), которые объясняют ограничения ввода и вывода. –
Это не сборка, это встроенная сборка, специфичная для одного компилятора, в основном это вопрос C/C++, а не вопрос сборки. –