アセンブリのビット

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

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

指示コンパイルして実行します gcc file_name.c ; ./a.out

比較するとスワップ

   #含まれています 
  #含まれています 
 / /交換 - 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; / * 1に示すようにそのCAは、それは* /を失敗したことを成功と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、DONE \ nを\ t"と
			 "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

 #含まれています 
 int型GCD(int型A、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を"第1、第2、GCD(第1、第2));

     0を返します。
 }