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; のようなことをしますか? m = newval; 返す

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"クロバー リストに追加する必要があります。

asm の完全な形式は次のとおりです。

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