我试图理解在程序集中编写代码的语法,以便首先正确地编写代码,然后高效地编写代码。在这个示例中,它显示了使用"=r"的示例。
asm volatile ("MRS %0, PMUSERENR_EL0\n": "=r"(value));这将读取寄存器的值并将其存储在值变量中。另一个示例使用::"r"
asm volatile ("MSR PMUSERENR_EL0, %0\n":: "r"(value));这会将值变量写入PMUSERENR_ELO寄存器。下面是另一个例子:如何测量ARM Cortex-A8处理器的程序执行时间?。
当我试图用上面的两个命令编译一个简单的测试代码时,我得到了错误::9:2: error: output operand constraint lacks '=' --如果我添加"=“并删除一个:”它将编译,但是当我测试它时,它只表示Illegal instruction
如果有人能解释差异,这将是有帮助的,许多汇编教程显示相同的格式,但没有解释。它在64位arm平台上,如果能提供任何洞察力的话。谢谢。
发布于 2016-04-12 13:09:39
发布于 2022-10-01 14:31:30
您正确地指出了这一解释,但错误地格式化了“输出的一个冒号和输入的两个冒号”。
在asm格式的扩展版本中,如下所示
asm("assembly code" : outputs : inputs : clobbers)
如果您没有输出,您仍然应该包括Colon,它的翻译如下
asm("assembly code"::inputs:clobbers)
如果您没有选择器(已更改的寄存器),则可以省略最后一个Colon,即asm("assembly code":outputs:inputs)。
https://stackoverflow.com/questions/36560646
复制相似问题