アセンブリのビット

によって2009年8月29日プラシャント
の下でファイルされる: 技術

読んだ後にこのロックフリーバッファについての記事を、CASの使用を見て(比較とスワップ)、私は同じようにアセンブリコードを投稿するように感じました。 ネイティブメソッドを記述し、Java(バック1.5、Javaの並行データ構造が多かれ少なかれ存在しない以外だったとき)からそれを呼び出すことがあった上のケースを使用しています。 さらに騒ぎがなければ、私はあなたにコードを解き放つよ :) 最初は、CAS用で、もう1つはユークリッドのアルゴリズム(このいずれかが同様に多くの場所とチュートリアルに記載されています)を使用して、コンピューティングGCDのためのものです。

コンパイルと実行命令を gcc file_name.c ; ./a.out

比較とスワップ

  の#include 
 の#include 
 / /交換 -  newValueは、comperandは古い/期待値です。
 / *
  *関数は、実際には、次のことを行います -  * destに値が他のnewValueはそのままにしておくことによって、それを交換しOldValueプロパティに等しい場合は、次のいないすべてのこれらのアトミック
  *
  *戻り値の2つのオプションがあります。
  * destの1.is初期値とoldvalにとそれを比較するfxnの呼び出しの負担を残す
  * 2。 ここの上でそれを行うと、0または1を返し、これはより効率的であるべき
  ** /

 / *後でマクロにそれを変更する* /
 int型CAS(int型* destは、int型のOldValueは、int newValueは){
	のprintf( "(%dは、%D、%d)が、" * destは、OldValueプロパティ、newValueは);
	 / * int型CAS(int型をdest、int型のOldValueは、int newValueは){* /
	 / * int型CAS(int型をdest、int型newValueは、int型のOldValue){* /
	 int型の結果= 1 ;/ * CASが成功したことを図1に、それは/ *失敗したが0​​を示す
	 / *ところでフラグが追い払ってくれるためにCCを設定する必要があります!  * /
	 __asm​​__ _のvolatile__(
			 "MOVL%2、%%eaxにする\ n \ t"は
			 "MOVL%3、%%ebxにする\ n \ t"は
			 "MOVL%0、%%ECXに\ n \ t"は
			 "LOCKます\ n \ t"は
			 "%%をCMPXCHG EBX、(%%ECXます)\ n \ t"は/ *同じ行にあるをロックする必要があります* /
			 "JZは\ n \ tをDONE"
			 "MOVL $ 0、%1は\ n \ t"は
			 "DONEます:\ n \ t"は
			 : "= M"(destが)、 "= G"(結果)
			 : "G"(OldValueプロパティ)、 "G"(newValueは)、 "M"(DEST)
			 : "%eaxに"、 "%ebxに"、 "ECX"、 "CC"
			 。)
	のprintf( "(%dは、%D、%d)が、" * destは、OldValueプロパティ、newValueは);
	結果を返します。
 }

 / * TODO
  * whileループでfxn上に置く別のASM fxnを書き、それが* /を成功しない限り続けようと

 int型のmain(){
	ます。int a = 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、A));
	のprintf( "%dにする\ n"、CAS(C、A、));
	の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、A));
	のprintf( "%dにする\ n"、CAS(C、A、));
	のprintf( "%dです\ n"、CAS(C、A、B));
	のprintf( "%dです\ n"、CAS(C、B、A));
	 0を返します。
 }

書式設定の注意事項 - WPのシンタックスハイライ​​トのように思えるが追加されてい 最後に、それを無視してください。

GCD

の#include 
 int型GCD(int型1は、int B){
     int型の結果;
     / *ユークリッドのアルゴリズムを使用して最大公約数を計算* /
     __asm​​__ _のvolatile__( "MOVL%1、%%eaxに;"
                           "MOVL%2、%%EBX;"
                           "CONTD:CMPL $ 0、%%EBX;"
                           "JEは、DONE;"
                           "xorl%%edxを、%%EDX;"
                           "idivl%%EBX;"
                           "MOVL%%ebxには、%%eaxに;"
                           "MOVL%%edxを、%%のEBX;"
                           "JMPはCONTD;"
                           "DONE:MOVL%%eaxに、%0;": "= G"(結果): "G"()、 "G"(B)
     。)

    結果を返します。
 }

 int型のmain(){
    第二に、最初のint;
    のprintf( "二つの整数を入力してください:");
     scanf関数( "%dは%d個"、&、最初&2番目)。

    のprintf( "%d個&%dの最大公約数は%dです\ n"、第一、第二、GCD(第1、第2、第));

     0を返します。
 }

コメント

    分遅れで張るのコメント