C/汇编中的双冒号“::”运算符

-1 c assembly inline-assembly colon

首先,不,我不是在谈论 C++ 范围解析运算符。

我有以下语法:

asm(
"mov R0,%0\n"
"mov R1,%1\n"
"mov R3,%2\n"
"mov R4,%3\n"
"mov R5,%4\n"
::"r"(<A_VALUE>),
"r"(<A_VALUE>),
"r"(<A_VALUE>),
"r"(<A_VALUE>),
"r"(<A_VALUE>),
:"r0","r1","r2"
)
Run Code Online (Sandbox Code Playgroud)

冒号和双冒号是什么意思?我确实记得在动态创建变量名时与字符串连接有关。

万提前致谢!

Att*_*tie 5

::不是运营商,它是由两个:分离器。有关更多详细信息,请参阅GCC 手册 - 扩展 ASM

asm asm-qualifiers ( AssemblerTemplate 
                 : OutputOperands 
                 [ : InputOperands
                 [ : Clobbers ] ])

asm asm-qualifiers ( AssemblerTemplate 
                      : OutputOperands
                      : InputOperands
                      : Clobbers
                      : GotoLabels)
Run Code Online (Sandbox Code Playgroud)

在您的情况下,您有一个空OutputOperands参数:

asm asm-qualifiers ( AssemblerTemplate 
                 : OutputOperands 
                 [ : InputOperands
                 [ : Clobbers ] ])

asm asm-qualifiers ( AssemblerTemplate 
                      : OutputOperands
                      : InputOperands
                      : Clobbers
                      : GotoLabels)
Run Code Online (Sandbox Code Playgroud)

  • 另请注意,内联汇编的这段代码具有未定义的行为 - 它写入寄存器 R3、R4 和 R5,但没有将它们声明为已损坏。(假设这是针对使用目标优先语法(例如 ARM)的 ISA 进行编译的。另外,您基本上永远不想使用 `mov reg, %0` 作为 asm 模板的第一条指令:而是要求编译器首先将操作数放在该寄存器中。例如,使用 `register int foo asm("r0")` 作为操作数,如 `"r"(foo)`。请参阅 https://stackoverflow.com/tags/inline- assembly/info (3认同)