这是一个使用扩展汇编代码的 C 函数:
static inline uint
xchg(volatile uint *addr, uint newval)
{
uint result;
asm volatile("lock; xchgl %0, %1" :
"+m" (*addr), "=a" (result) :
"1" (newval) :
"cc");
return result;
}
我读了this codeproject link了解如何在 C 代码中使用扩展程序集,但我对这段代码感到困惑。
我不明白这段代码中的某些内容:
1) (newval)
在哪里用作汇编代码的输入? (%0
是指 (*addr)
而 %1
是指 (result)
对吧? "1"(newval)
从未在代码中使用过(我们从未在代码中看到 %2
)。或者我错了?)
2) 输入操作数中 "1"(newval)
中的 "1"
是什么?
3) "+m"
符号在 "+m"(*addr)
中是什么意思?
最佳答案
你所有关于GCC asm
的问题的答案都可以来自6.41 Assembler Instructions with C Expression Operands和 6.42 Constraints for asm Operands .
关于c - 我不明白 C 中的这个扩展汇编内联代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20945929/