内联汇编中的输出寄存器必须用“=”约束声明,意思是“只写”[1]。这到底是什么意思——真的禁止在程序集中阅读和修改它们吗?例如,考虑以下代码:
uint8_t one ()
{
uint8_t res;
asm("ldi %[res],0\n"
"inc %[res]\n"
: [res] "=r" (res)
);
return res;
}
程序集将输出寄存器设置为 0,然后将其递增。这是否打破了“只写”约束?
更新
当我将内联汇编更改为直接在输出寄存器上工作时,我看到我的内联汇编中断的问题,而不是使用 r16 进行计算并最终将 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