Trochu sestavy

29.srpna 2009 od Prashant · Komentáře
Soubor pod: Technologie

Po přečtení tohoto článku o vyrovnávací paměti zámku zdarma a vidí využití CAS (porovnat a swap), připadal jsem si jako vysílání kód shromáždění, aby učinily totéž. Use case tam bylo napsat nativní metody a volat z Java (1,5 v roce, kdy souběžné datové struktury v jazyce Java byly více či méně neexistuje). Bez dalších okolků, budu uvolnit kód na vás :) . Prvním z nich je pro CAS, a druhý je pro práci na počítači pomocí GCD Euclid algoritmus (ten lze nalézt na mnoha místech a návody, jak dobře).

Sestavit a spustit pokyny gcc file_name.c ; ./a.out

Porovnejte a Swap

   # Include 
  # Include 
 / / Výměna - newValue, comperand je stará / očekávaná hodnota
 / *
  * Funkce vlastně dělá následující věc - pokud hodnota * dest se rovná oldvalue pak jej nahradit jiným newValue ponechat beze změny: všechny tyto atomicky
  *
  * Existují dvě možnosti pro návratové hodnoty
  * 1.is výchozí hodnota * dest a ponechat břemeno volání fxn porovnat ji s oldval
  * 2.  to sem a return 0 nebo 1, mělo by to být efektivnější
  * * /

 / * Později změnit na makro * /
 int cas (int * dest, int oldvalue, newValue int) {
	 printf ("(% d,% d,% d)", * dest, oldvalue, newValue);
	 / * Int CAS (int dest, int oldvalue, newValue int) {* /
	 / * Int CAS (int dest, int newValue, oldvalue int) {* /
	 int result = 1, / * 1 ukazuje, že CAS podařilo a 0 ukazuje, že selhala * /
	 / * Btw třeba nastavit cc pro vlajku praštit!  * /
	 __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" / * LOCK by měl být na stejném řádku * /
			 "JZ Hotovo \ n \ t"
			 "Movl $ 0,% 1 \ n \ t"
			 "Hotovo: \ n \ t"
			 : "= M" (dest), "= g" (výsledek)
			 : "G" (oldvalue), "G" (newValue), "m" (dest)
			 : "% Eax", "% ebx", "ecx", "CC"
			 );
	 printf ("(% d,% d,% d)", * dest, oldvalue, newValue);
	 return vysledek;
 }

 / * TODO
  * Napsat další asm fxn který klade vyšší fxn v cyklu while a dál snažit, pokud uspěje * /

 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, a));
	 printf ("% d \ n", CAS (c, b, b));
	 * C = 6;
	 / * C = 5; * /
	 printf ("Změna hodnoty * C% d \ n", * c);
	 printf ("% d \ n", CAS (c, b, b));
	 printf ("% d \ n", CAS (c, b, a));
	 printf ("% d \ n", CAS (c, a, a));
	 printf ("% d \ n", CAS (c, a, b));
	 printf ("% d \ n", CAS (c, b, a));
	 return 0;
 }

Formátování poznámky - vypadá jako zvýrazňovač syntaxe WP přidává Na konci ignorovat.

GCD

 # Include 
 int gcd (int a, int b) {
     int výsledku;
     / * Počítat největší společný dělitel pomocí Euclid algoritmus * /
     __asm__ __volatile__ ("movl% 1,%% eax;"
                           "Movl% 2,%% ebx;"
                           "CONTD: cMpl $ 0,%% ebx;"
                           "Je provedeno;"
                           "Xorl%% edx,%% edx,"
                           "Idivl%% ebx;"
                           "Movl%% ebx,%% eax;"
                           "Movl%% edx,%% ebx;"
                           "Jmp CONTD;"
                           "Hotovo: movl%% eax,%, 0,": "= g" (výsledek): "g" (a), "G" (b)
     );

     return vysledek;
 }

 int main () {
     int první, druhý,
     printf ("Zadejte dvě celá čísla:");
     scanf ("% d% d", a první, druhý a);

     printf ("% d GCD &% d je% d \ n", první, druhý, gcd (první, druhý));

     return 0;
 }