アセンブリのビット

2009年8月29日でプラシャント
報告Filed under: 技術

読み終わった後、この )の資料を無料についてロックバッファを使用し見ての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;

コメント

    ディスカスブログによって供給コメント