AVR 内联汇编:输出变量更改而无需指令更改它

问题描述 投票:0回答:1

我正在尝试为 ATmega328P 编写一些内联汇编代码 我发现我的输出变量的变化与我预期的不同。所以我将原始代码简化为:

uint8_t a=0;
__asm__ (
        "nop " "\n\t"
        :"=&r" (a)
        : 
        );

我期望 a 的值保持不变,但根据我在程序中的位置,我将 a 的代码值有时会更改为其他值。 我不明白为什么会发生这种情况。如果有人向我解释我所缺少的东西,我会很高兴。

c++ avr inline-assembly avr-gcc
1个回答
0
投票

"=&r" (a)

这意味着:

  • 内联汇编设置
    a
    的值(因为
    a
    是带有
    =
    约束修饰符的输出操作数。
  • 在内联汇编时,由于寄存器限制
    a
    r
    将位于通用寄存器 (R2...R31) 中。
  • a
    将被分配给不会重叠任何输入的寄存器(由于
    &
    “early-clobber”常数修饰符。

例如,请参阅关于约束的 AVR-LibC inline asm Cookbook

由于内联asm设置了

a
的值,因此可以省略
a = 0
的初始化,因为内联asm设置了
a
但不将其用作输入。

© www.soinside.com 2019 - 2024. All rights reserved.