我正在尝试为 ATmega328P 编写一些内联汇编代码 我发现我的输出变量的变化与我预期的不同。所以我将原始代码简化为:
uint8_t a=0;
__asm__ (
"nop " "\n\t"
:"=&r" (a)
:
);
我期望 a 的值保持不变,但根据我在程序中的位置,我将 a 的代码值有时会更改为其他值。 我不明白为什么会发生这种情况。如果有人向我解释我所缺少的东西,我会很高兴。
"=&r" (a)
这意味着:
a
的值(因为 a
是带有 =
约束修饰符的输出操作数。a
,r
将位于通用寄存器 (R2...R31) 中。a
将被分配给不会重叠任何输入的寄存器(由于 &
“early-clobber”常数修饰符。例如,请参阅关于约束的 AVR-LibC inline asm Cookbook。
由于内联asm设置了
a
的值,因此可以省略a = 0
的初始化,因为内联asm设置了a
但不将其用作输入。