Trochu montáže

29.srpna 2009 od Prashant · Komentáre
Súbor pod: technológie

Po prečítaní tohto článku o nárazníky Lock Free a videl využitie CAS (porovnanie a výmena), pripadal som si ako vysielanie kód assembleri, aby urobili to isté. Use case tam bolo napísať natívne metódy a volať z Java späť do 1.5, kedy súbežné dátové štruktúry v Jave boli viac či menej neexistuje). Bez ďalších okolkov, ja sa uvoľnil kód na vás :) . Prvým z nich je pre CAS a druhý je pre výpočtovú GCD pomocou Euclid algoritmus (ten možno nájsť na mnohých miestach a cvičenie i).

Kompilovať a spúšťať inštrukcie gcc file_name.c ; ./a.out

Porovnajte a Swap

   # Include 
  # Include 
 / / Výmena - newValue, comperand je starý / očakávaná hodnota
 / *
  * Funkcia vlastne robí nasledujúce vec - ak je hodnota na * dest sa rovná oldvalue potom ho nahradiť iným newValue ponechať bezo zmeny: to všetko atomárny
  *
  * Existujú dve možnosti pre návratové hodnoty
  * 1.is počiatočná hodnota z * dest a nechať záťaže volajúceho FXN porovnať ju s oldval
  * 2.  to sem a vráti 0 alebo 1, malo by to byť efektívnejšie
  ** /

 / * Neskôr zmeniť v makre * /
 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 result = 1 ;/ * 1 ukazuje, že sa podarilo cas a 0 ukazuje, že sa nepodarilo * /
	 / * Btw treba nastaviť cc pre vlajky prepisovanie!  * /
	 __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 mal byť na rovnakom riadku * /
			 "JZ Dané \ n \ t"
			 "Movl $ 0,% 1 \ n \ t"
			 "Dané: \ n \ t"
			 : "= M" (dest), "= g" (výsledok)
			 : "G" (oldvalue), "G" (newValue), "m" (dest)
			 : "% EAX", "% EBX", "ECx", "cc"
			 );
	 printf ("(% d,% d,% d)", * dest, oldvalue, newValue);
	 return vysledok;
 }

 / * TODO
  * Napísať ďalšie asm FXN ktorý sa prejavuje predovšetkým FXN v cykle while a ďalej snažiť, ak uspeje * /

 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 ("meniace sa hodnota * c k% 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, a, b));
	 printf ("% d \ n", CAS (c, b,));
	 return 0;
 }

Formátovanie poznámky - sa zdá byť ako zvýrazňovač syntaxe wp je pridanie nakoniec ignorovať.

GCD

 # Include 
 int GCD (int, int b) {
     int vysledok;
     / * Počítať najväčší spoločný deliteľ pomocou Euclid algoritmus * /
     __asm__ __ volatile__ ("movl% 1,%% EAX;"
                           "Movl% 2,%% EBX;"
                           "CONTD: cMpl $ 0,%% EBX;"
                           "Je vykonané;"
                           "Xorl%% EDX,%% EDX;"
                           "Idivl%% EBX;"
                           "Movl%% EBX,%% EAX;"
                           "Movl%% EDX,%% EBX;"
                           "JMP CONTD;"
                           "Dané: movl%% EAX,% 0;": "= g" (výsledok): "g" (), "G" (b)
     );

     return vysledok;
 }

 int main () {
     int prvý, druhý,
     printf ("Zadajte dve celé čísla:");
     scanf ("% d% d", a prvý a druhý);

     printf ("% d GCD zo &% d je% d \ n", prvá, druhá, GCD (prvá, druhá));

     return 0;
 }