使用内联汇编进行双重赋值

时间:2015-01-26 22:45:56

标签: c assembly avr inline-assembly avr-gcc

关注this manual我想创建最简单的内联AVR程序集片段:将两个变量的值复制到另外两个变量。

uint8_t a, b, c, d;
a = 42;
b = 11;
asm(
    "mov %0, %2\n\t"
    "mov %1, %3\n\t"
    : "=r" (c), "=r" (d)
    : "r" (a), "r" (b)
);

我希望它等同于:

uint8_t a, b, c, d;
a = 42;
b = 11;
c = a;
d = b;

但是,运行后cd的值均等于 42 。如果我将asm snipptet更改为:

asm(
    "mov %0, %3\n\t"
    "mov %1, %2\n\t"
    : "=r" (c), "=r" (d)
    : "r" (a), "r" (b)
);

c等于 11 d等于 42 。同样,将两个源操作数更改为%2会产生两个 42 ,并将它们设置为%3会产生两个 11

为什么第一个版本不能按预期工作?

0 个答案:

没有答案