::“r”vs:“= r”汇编澄清

时间:2016-04-11 22:48:50

标签: c gcc assembly arm arm64

我正在尝试理解在汇编中写入的语法,以便首先正确地编写代码,然后有效地编写代码。 在此示例中,它使用"=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位手臂平台上,如果它提供任何洞察力。感谢。

1 个答案:

答案 0 :(得分: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

  

如果没有输出值与汇编代码相关联,则该部分   必须为空,但两个冒号必须仍然分开汇编代码   来自输入操作数。

原因是因为这是标准。一个冒号用于输出,两个冒号用于输入。