代码的第一部分按预期工作。那里
mov %[SRC], %[DEST] ; copies %[SRC] into %[DEST], which is now 1
add $5, %0 ; adds 5 to %0 (which is %[DEST]), so that's 6
第二部分不起作用,因为你从不使用%[SRC]
,并且因为%[DEST]
不是输入操作数,因此其值不参与计算。您只需获取 gcc 决定使用的寄存器中的内容即可。第三部分也因同样的原因而失败。
为了使其工作,您需要指定dst
作为输入和输出操作数,因为您既使用它的值又更改它。但是,这不起作用:
asm("add $5, %0" // This does not work!
: "=r" (dst)
: "r" (dst));
因为现在你有一个输入操作数%1
有价值dst
和一个不同的输出操作数%0
其值将被写入dst
,而你从不使用%1
。这个符号可以让你写
asm("mov %1, %0; add $5, %0" // needlessly inefficient!
: "=r" (dst)
: "r" (dst));
但这当然是不必要的低效。为了使用单个寄存器来完成此操作,您需要使用匹配约束像这样:
asm("add $5, %0"
: "=r" (dst)
: "0" (dst));
这告诉海湾合作委员会%0
作为输入操作数是允许的,并且它的值为dst
. Here是 gcc 手册的相关部分。
最后,使用命名操作数,它看起来像这样:
asm ("add $5, %[DEST]"
: [DEST] "=r" (dst)
: "[DEST]" (dst));