【发布时间】:2020-09-27 16:27:40
【问题描述】:
作为(初学者)练习,我想使用 GNU asm 在 C 中实现交换操作。
我对这些限制感到困惑。我的代码是:
int c = 1;
int b = 2;
asm ("xchg %2,%3"
: "=r" (c), "=r" (b)
: "<X>" (c), "<Y>" (b)
);
return c+10*b;
其中 $
("0", "0") 不编译。 (为什么?)
("0", "r") 返回 12,即预期结果。
("r", "r") 和 ("r", "0") 返回 21,就好像什么都没发生一样。 (为什么?)
那么在这些情况下有什么问题呢?为什么会失败?
【问题讨论】:
-
0,0 没有意义,你不能把两个操作数放在同一个地方。使用
r,编译器可以选择它想要的任何寄存器,并且由于您从未在 asm 块中引用 0 或 1,因此不知道结果在哪里。 0,r 恰好起作用只是一个意外,它仍然是错误的。正确的约束是 1,0。 -
@Jester "0,1" 有效,"1,0" 无效。看来我的主要误解是将“0”视为某个固定关键字,而不是对“%0”的引用,对吗?如果是这样,请将其作为答案(也许对这里的其他人提供更多解释)。
标签: c assembly gcc inline-assembly