【问题标题】:Double Colon "::" operator in C/assemblyC/程序集中的双冒号“::”运算符
【发布时间】:2021-10-13 23:51:39
【问题描述】:

首先,不,我不是在谈论 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"
)

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

提前百万感谢!

【问题讨论】:

    标签: c assembly inline-assembly colon


    【解决方案1】:

    :: 不是运算符,它是两个 : 分隔符。详情请见GCC Manual - Extended ASM

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

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

    asm(
        
        // Assembler Template
        "mov R0,%0\n"
        "mov R1,%1\n"
        "mov R3,%2\n"
        "mov R4,%3\n"
        "mov R5,%4\n"
        
        :
        
        // OutputOperands
        // (none)
        
        :
        
        // Input Operands
        "r"(<A_VALUE>),
        "r"(<A_VALUE>),
        "r"(<A_VALUE>),
        "r"(<A_VALUE>),
        "r"(<A_VALUE>),
        
        :
        
        // Clobbers
        "r0","r1","r2"
        
    )
    

    【讨论】:

    • 另请注意,内联汇编的这个 sn-p 具有未定义的行为 - 它写入寄存器 R3、R4 和 R5 而不将它们声明为已破坏。 (假设这是为使用目标优先语法的 ISA 编译的,例如 ARM)。此外,您基本上永远不想使用 mov reg, %0 作为 asm 模板的第一条指令:而是首先要求编译器将操作数放在该寄存器中。例如通过使用register int foo asm("r0") 作为"r"(foo) 之类的操作数。见stackoverflow.com/tags/inline-assembly/info
    猜你喜欢
    • 2013-11-28
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    相关资源
    最近更新 更多