有點集會
看完這篇文章有關鎖空閒緩衝區,看到使用了CAS(比較和交換),我發布的彙編代碼,做同樣的感覺。 使用的情況下,那邊是寫一個本地方法,並調用它從Java(1.5,當在Java並發數據結構不存在或多或少)。 事不宜遲,我會釋放到你的代碼
。 首先是中科院和計算GCD的第二個是用歐幾里德算法(此人可以發現,在許多地方和教程以及)。
編譯和運行指示 gcc file_name.c ; ./a.out
比較和交換
#包括#包括 / /交換 - newvalue,comperand是舊的/預期值 / * *函數實際上做以下的事情 - 如果在* dest的值是等於oldvalue然後newvalue其他不改變它取代:做所有這些原子 * *有兩個返回值的選項 * 1.is初始值* dest的離開,調用fxn負擔比較與OLDVAL * 2。 在這裡做,並返回0或1,這應該是更有效 ** / / *後來改變成宏* / INT CAS(INT * dest中,oldvalue,INT newvalue){ 輸出(“(%D,為%d,%d個)”,* dest中,oldvalue,newValue)以; / * CAS(目的INT,INT oldvalue,newValue)以{* / / * CAS(INT目的,newvalue INT oldvalue){* / 結果= 1 ;/ * 1可以看出,CAS成功,0表示失敗* / / * BTW需要設置標誌重挫CC! * / __asm__ __ volatile__( “MOVL%2,%eax中\ N \ T” “MOVL%3,%ebx中\ N \ T” “MOVL%0%ECX \ N \ T” “鎖\ N \ T” \ N \ T“CMPXCHG%EBX(%ECX)”/ *應該鎖定在同一行* / “JZ \ N \ T” “MOVL $ 0%1 \ N \ T” “DONE:\ N \ T” “M”(DEST),“克”(結果) :“G”(oldvalue),“G”(newValue)以“M”(DEST) :“%eax中”,“%ebx中”,“ECX”,“CC” ); 輸出(“(%D,為%d,%d個)”,* dest中,oldvalue,newValue)以; 返回結果; } / *的TODO *寫在一個while循環以上fxn了另一個ASM fxn的不斷嘗試,除非它成功* / 詮釋的主要(){ A = 5,B = 6; INT * C =(INT *)malloc的(如sizeof(int)); * C = 6; / * C = 6 * / printf(“請為%d \ N”,CAS(C,B,B)); printf(“請為%d \ N”,CAS(C,B,A)); 輸出(“%d個\ N”,CAS(C,A,A)); printf(“請為%d \ N”,CAS(C,B,B)); * C = 6; / * C = 5; * / 輸出(“變化值* C至%d條\ n”,* C); printf(“請為%d \ N”,CAS(C,B,B)); printf(“請為%d \ N”,CAS(C,B,A)); 輸出(“%d個\ N”,CAS(C,A,A)); printf(“請為%d \ N”,CAS(C,A,B)); printf(“請為%d \ N”,CAS(C,B,A)); 返回0; }
格式化筆記 - 像WP語法高亮似乎增加 在年底,忽視這一點。
最大公約數
#包括GCD INT(INT A,INT B){ int結果; / *計算最大公約數使用Euclid的算法* / __asm__ __ volatile__(“MOVL%1,%eax中;” “MOVL%2,%ebx中;” “cmpl續完:$ 0,%ebx中;” “JE; 的“xorl%EDX,%edx中;” 的“idivl%EBX; “MOVL%%EBX,EAX%; “MOVL%%,%%ebx中EDX; “JMP續完; “DONE:MOVL%eax中,%0”:“克”(結果):(一)“G”,“G”(二) ); 返回結果; } 詮釋的主要(){ int的第一,第二; printf的(“請輸入兩個整數:”); scanf函數(“%d的%d”,與第一及第二); 輸出(“%d的%d的最大公約數是%d \ N”,第一,第二,GCD(第一,第二)); 返回0; }



































