2016-04-11 3 views
-2

Я пытаюсь понять синтаксис записи в сборке, чтобы сначала правильно и правильно записать код. в этом примере он показывает пример использования "=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-битной платформе, если это дает какое-либо понимание. Благодарю.

+0

Вы уверены, что использовали два двоеточия? ('::') – Jester

+0

См. [Этот сборник ссылок на 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), которые объясняют ограничения ввода и вывода. –

+0

Это не сборка, это встроенная сборка, специфичная для одного компилятора, в основном это вопрос C/C++, а не вопрос сборки. –

ответ

1

нашел ответ в этой книге: https://books.google.com/books?id=Bl0_hWV20TAC&pg=PA370&lpg=PA370&dq=two+colon+%22::%22+in+assembly+language&source=bl&ots=Ha8EkNUJee&sig=p6v6iPOCYjBJdmBBVx2ZdxoRT2I&hl=en&sa=X&ved=0ahUKEwj8xcOElYnMAhVQ_WMKHR-JC7IQ6AEIRjAH#v=onepage&q=two%20colon%20%22%3A%3A%22%20in%20assembly%20language&f=false

If no output values are associated with the assembly code, the section must be blank, but two colons must still separate the assembly code from the input operands.

почему происходит потому, что это стандарт. Один двоеточие для выходов и два для входа.

Смежные вопросы