在GCC召集大会?

rbr*_*200 8 c x86 gcc constraints inline-assembly

#include <stdlib.h>

static inline uint
xchg(volatile unsigned int *addr, unsigned int newval)
{
   uint result;
   asm volatile("lock; xchgl %0, %1" : "+m" (*addr), "=a" (result) : "1" (newval) : "cc");

return result;    
}
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我这段代码到底是做什么的吗?我的意思是我有一个想法或这个命令的部分."1"newval是输入,"= a"是清除其先前的值并更新它."m"用于内存操作,但我对此功能的功能感到困惑."+ m"标志有什么作用?这个函数是否像m = a那样; m = newval; 回来一个

osg*_*sgx 6

=并且+是约束修饰符.

http://gcc.gnu.org/onlinedocs/gcc/Modifiers.html#Modifiers

`='表示该操作数对该指令是只写的:先前的值被丢弃并被输出数据替换.

`+'表示该操作数由指令读写.

基本约束在这里

http://gcc.gnu.org/onlinedocs/gcc/Simple-Constraints.html#Simple-Constraints

m 允许使用内存操作数,以及机器通常支持的任何类型的地址.

.. 1..允许匹配指定操作数的操作数.如果一个数字与同一替代中的字母一起使用,则数字应该是最后一个.

'a'是i386特有的

http://gcc.gnu.org/onlinedocs/gcc/Machine-Constraints.html#Machine-Constraints

a a(eax)寄存器.


osg*_*sgx 2

constraints。它们不是变量,而是模式,例如“w”、“r”、“r+”fopen()

这里描述了其中一些

http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

第 6 部分:有关约束的更多信息。

最后一个“cc”是“clobber”。

如果我们的指令可以改变条件代码寄存器,我们必须添加"cc"到破坏列表中。

asm的完整格式是

   asm ( assembler template 
       : output operands                  /* optional */
       : input operands                   /* optional */
       : list of clobbered registers      /* optional */
       );
Run Code Online (Sandbox Code Playgroud)