::"r" 与 :"=r" 汇编说明

kam*_*tor 3 c assembly gcc inline-assembly arm64

我试图理解汇编语言的语法,首先正确地编写代码,然后高效地编写代码。在此示例中,它显示了使用的示例"=r"

asm volatile ("MRS %0, PMUSERENR_EL0\n": "=r"(value));
Run Code Online (Sandbox Code Playgroud)

这会读取寄存器的值并将其存储在值变量中。另一个例子使用::"r"

asm volatile ("MSR PMUSERENR_EL0, %0\n":: "r"(value));
Run Code Online (Sandbox Code Playgroud)

这会将值变量写入 PMUSERENR_ELO 寄存器。这是另一个例子:如何测量 ARM Cortex-A8 处理器中的程序执行时间?。

当我尝试使用上述两个命令编译一个简单的测试代码时,我收到错误::9:2: error: output operand constraint lacks '='如果我添加“=”并删除一个“:”,它将编译,但当我测试它时,它只是说Illegal instruction

如果有人可以解释其中的差异,这将很有帮助,许多组装教程显示相同的格式但没有解释。如果这提供了任何见解的话,它是在 64 位 ARM 平台上进行的。谢谢。

kam*_*tor 5

在书中找到了答案:专业汇编语言:扩展ASM

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

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