8
#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;    
}

有人能告诉我这段代码到底做了什么吗?我的意思是我有一个想法或这个命令的一部分。"1" newval 是输入,"=a" 是刷新它之前的值并更新它。“m”用于内存操作,但我对这个函数的功能感到困惑。“+m”符号有什么作用?此函数是否执行类似 m=a; 的操作?米=新瓦尔;返回一个

4

2 回答 2

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) 寄存器。

于 2010-03-22T03:19:09.933 回答
2

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

其中一些在此处进行了描述

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

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

最后一个“cc”是clobber。

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

asm 的完整格式是

   asm ( assembler template 
       : output operands                  /* optional */
       : input operands                   /* optional */
       : list of clobbered registers      /* optional */
       );
于 2010-03-22T03:14:49.457 回答