带avr gcc的Clobber X、Y、Z寄存器

带avr gcc的Clobber X、Y、Z寄存器,gcc,avr,inline-assembly,avr-gcc,Gcc,Avr,Inline Assembly,Avr Gcc,如果我编码 asm volatile("" ::: "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r10", "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", "r24", "r25",

如果我编码

    asm volatile("" ::: "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8",
                    "r10", "r11", "r12", "r13", "r14", "r15", "r16", "r17",
                    "r18", "r19", "r20", "r21", "r22", "r23", "r24", "r25",
                    "r26", "r27", "r28", "r29", "r30", "r31", "memory");
分解avr-gcc的结果,我可以看到avr-gcc假设X,Y和Z没有被破坏。然而,它们被隐式声明为clobbered,因为它们是成对的(r26,r27),(r28,r29)和(r30,r31)。avr gcc似乎将X、Y、Z视为单独的寄存器

如果我想这样解决这个问题

    asm volatile("" ::: "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8",
                    "r10", "r11", "r12", "r13", "r14", "r15", "r16", "r17",
                    "r18", "r19", "r20", "r21", "r22", "r23", "r24", "r25",
                    "r26", "r27", "r28", "r29", "r30", "r31", "X", "Y", "Z", "memory");
然后avr gcc投诉

test.cpp:212:91: error: unknown register name ‘Z’ in ‘asm’
test.cpp:212:91: error: unknown register name ‘Y’ in ‘asm’
test.cpp:212:91: error: unknown register name ‘X’ in ‘asm’
根据编译器的错误以及文档,似乎无法指定X、Y和Z


然后我如何告诉avr gcc除了“r0”之外的所有寄存器都被阻塞了?特别是,我如何告诉它X,Y,Z被击倒了?

我不能尝试这个,但是像这样的东西怎么样:
asm volatile(“:”=X”(junk1),“=Y”(junk2),“=Z”(junk3)…
?这可能会起作用。但与clobber不同,它会显式调用以生成一些机器指令。这是我想要避免的。如果我找不到更好的解决方案,我将用手工编码的汇编程序替换asm volatile周围的整个块。反正它只有两条指令。因此,在这种特定情况下,它是最便宜的解决方案。然而,我仍然想知道我如何明确地删除x、y和z。
它将显式调用以生成一些机器指令
它将如何?像什么?除了让gcc知道在退出asm时指定的寄存器将与指定的变量相关联之外,我看不到将生成哪些指令。因此它/应该d/工作。但我无法尝试它是否真的工作。有时编译器会让您感到惊讶。请注意,至少在一个函数中,我无法关闭所有寄存器。
Y
r28:r29
)被GCC用作帧指针,它会抱怨没有更多寄存器来存储该指针。