内联汇编中的输出寄存器必须用“=”约束声明,意思是“只写”[1]。这意味着什么 - 它是否真的被禁止在大会内部读取和修改它们?例如,请考虑以下代码:在avr-gcc内联汇编中使用输出寄存器有哪些限制?
uint8_t one()
{
uint8_t res;
asm("ldi %[res],0\n"
"inc %[res]\n"
: [res] "=r" (res)
);
return res;
}
程序集将输出寄存器设置为0,然后递增它。这是否打破了“只写”约束?
UPDATE
我看到在我的内联汇编休息时,我把它改为直接在输出寄存器的工作,而不是使用R16的计算,最后mov'ing R16到输出问题寄存器。代码在这里:http://ideone.com/JTpYma。它将结果打印到串行,你只需要定义F_CPU和BAUD。只有使用gcc-4.8.0而不使用gcc-4.7.2时才会出现该问题。
[1] http://www.nongnu.org/avr-libc/user-manual/inline_asm.html
你可能是错在这里,看到我的编辑。或者它只是一个编译器错误。 –
编辑答案也是。 – Jester
确实修复了它,谢谢! –