首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >*“r”与“=r”汇编澄清

*“r”与“=r”汇编澄清
EN

Stack Overflow用户
提问于 2016-04-11 22:48:49
回答 2查看 3.8K关注 0票数 2

我试图理解在程序集中编写代码的语法,以便首先正确地编写代码,然后高效地编写代码。在这个示例中,它显示了使用"=r"的示例。

代码语言:javascript
复制
asm volatile ("MRS %0, PMUSERENR_EL0\n": "=r"(value));

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

代码语言:javascript
复制
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平台上,如果能提供任何洞察力的话。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-12 13:09:39

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

如果没有与程序集代码关联的输出值,则区段必须为空,但两个冒号仍必须将程序集代码与输入操作数分开。

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

票数 4
EN

Stack Overflow用户

发布于 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)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36560646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档