アセンブリのビット
読み終わった後、この )の資料を無料についてロックバッファを使用し見てのCAS(比較スワップ、私は同じようにアセンブリコードを投稿感じたように。 そこにいた以上のユースケースは、ネイティブメソッドを記述するとJava(バック1.5で、ときにJavaでの同時データ構造は、多かれ少なかれ存在非された)から、それを呼び出します。 前置きがなければ、私はあなたにコードを発揮するでしょう
。 まず、CASのであり、2番目のですコンピューティングユークリッドのアルゴリズムを使用して(この1つは多くの場所で、チュートリアルのように見つけることができます最大公約数も)。
コンパイルして実行する手順は、 gcc file_name.c ; ./a.out
比較とスワップ
#が含まれます#が含まれます / /交換 - newValueは、comperandは、古い/期待値は / * *機能、実際に次のことがない - *のdestに値がしnewValueは他の人によってそれはそのままに、それを置き換える:これらのすべての原子かOldValueプロパティに等しい場合 * *はあるの戻り値の2つのオプションがあります *のdestの* 1.is初期値とoldvalとそれを比較するfxnを呼び出すの負担を残して * 2。 ここでそれを超えるか、0または1を、これはより効率的にする必要があります戻る * * / / *後でマクロ*にそれを変更する/ int型のCA(int型* destを、int型OldValueプロパティは、int newValueは)( のprintf("(%d個、%dは、%d)が"、* destを、OldValueプロパティ、newValueは); / * int型のCA(int型destは、int型OldValueプロパティは、int newValueは)(/ * / * int型のCA(int型destは、int型newValueには、int OldValueプロパティ)(/ * int型の結果= 1; / * 0を示し、それは*に失敗成功した構造式1に示す/ / *バイザウェイ必要のccフラグ完敗に設定する! * / __asm__ __volatile__( "movl%2、%%のeaxにする\ n \ tを" "movl%3、%%のEBXにする\ n \ tを" "movl%0、%%のECXレジスタ\ nの\ tを" する\ n"\ tをロック" / *ロックは同じ行*にする必要があります"CMPXCHGの%%のEBXに、(%%のECXレジスタ)を\ n \ t"は/ "jz"は\ nを\トン出尽くした "movl $ 0、%1する\ n \ t"を "完了:\ nの\ tを" :"= m"を(destが)"、"(結果)gを= :""(OldValueプロパティ)"、"(newValueは)、"m"を(destの)gのgの :"%eaxに"は、"%のEBXに"、"ECXに"を"、"のcc ); のprintf("(%d個、%dは、%d)が"、* destを、OldValueプロパティ、newValueは); 戻り値の結果。 ) / *のTODO whileループの中fxn上記置き、それは*を成功しない限り、努力を続ける別のasm fxnを書く* / int型のmain()( int型= 5、b = 6; int型* cは=(int型*)はmalloc(sizeof演算(int型)); * cは= 6; / * int型のC = 6; * / のprintf("%d個の\ n"のは、CAS(cはb、b)); のprintf("%d個の\ n"のは、CAS(cはb)); のprintf("%d個の\ n"のは、CAS(cは、)); のprintf("%d個の\ n"のは、CAS(cはb、b)); * cは= 6; / * cは= 5; * / のprintf("%に* cの変化値d \ n"の、* c)の; のprintf("%d個の\ n"のは、CAS(cはb、b)); のprintf("%d個の\ n"のは、CAS(cはb)); のprintf("%d個の\ n"のは、CAS(cは、)); のprintf("%d個の\ n"のは、CAS(cは、b)); のprintf("%d個の\ n"のは、CAS(cはb)); 戻り0; )
ノートの書式を設定 - WPの構文ハイライトのように追加されている それを無視して最後に、インチ
最大公約数
#が含まれますintは(int型、int型を最大公約数b)( int型の結果。 / *計算最大公約数は、ユークリッドのアルゴリズム*を使用して/ __asm__ __volatile__("movl%1、%%eaxに。" "movl%2、%%のEBXに。" "表に示さ:cmpl $ 0、%%のEBXに。" "仁がDONE;" "xorl%%のEDXには、%%のEDXに。" "idivlの%%EBXに。" "movl%%のEBXには、%%eaxに。" "movl%%のEDXには、%%のEBXに。" "JMPの表に示さ;" "DONEに:movl%の%eaxには、%0;":""(結果)gの=:""()、"g"は(b)gを ); 戻り値の結果。 ) int型のmain()( int型の最初、2番目。 のprintf("")の2つの整数を:入力してください。 scanf関数("%d個の%d個"、&、最初&2番目); のprintf("GCDは%dの&%dは%d個の\ n"のは、まず、2番目、GCDのです(2番目の最初の)); 戻り0; )



































