Malo skupštine

29. kolovoz 2009 by prashant · Komentari
Varalica pod: tehnologija

Nakon čitanje ovaj članak o zaključavanje bez odbojnika i vidim korištenje CAS-a (usporedi i swap), osjećao sam se kao postavljanje sklopa kod da učine isto. Koristite slučaj tamo je pisati izvorni način i poziv iz Java (natrag u 1.5, kada istodobnih strukture podataka u Javi su manje ili više ne postoji). Bez dodatnih teškoća, ja ću osloboditi kod na vas :) . Prvo je za CAS i drugi je za računanje fact koristeći algoritam Euclid '(ovo se može naći u mnogim mjestima i tutoriali, kao i).

Izraditi upute i pokrenuti gcc file_name.c ; ./a.out

Usporedite Swap

   # Include 
  # Include 
 / / Razmjena - newvalue, comperand je stara / očekivana vrijednost
 / *
  * Funkcija zapravo radi sljedeće stvari - ako je vrijednost u * DEST jednaka oldvalue zatim ga zamijeniti newvalue drugi ostaviti ista: učiniti sve ove atomically
  *
  * Postoje dvije mogućnosti za povratak vrijednosti
  * 1.is početna vrijednost * DEST i ostaviti teret poziva fxn ga usporediti s oldval
  * 2.  to učiniti ovdje i vratite se 0 ili 1, to bi trebao biti učinkovitiji
  ** /

 / * Kasnije ga promijeniti u makro * /
 CAS int (int * odred, int oldvalue, int newvalue) {
	 printf ("(% d,% d,% d)", * odred, oldvalue, newvalue);
	 / * Int cas (int odred, int oldvalue, int newvalue) {* /
	 / * Int cas (int odred, int newvalue, int oldvalue) {* /
	 int rezultat = 1 ;/ * 1 pokazuje da cas je uspio i 0 pokazuje da nije uspio * /
	 / * Btw potrebno za postavljanje CC za zastavu clobbering!  * /
	 __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" / * treba LOCK biti na istom retku * /
			 "JZ Sastavljeno \ n \ t"
			 "Movl $ 0,% 1 \ n \ t"
			 "Gotovo: \ n \ t"
			 : "= M" (odred), "= g" (rezultat)
			 : "G" (oldvalue), "g" (newvalue), "m" (odred)
			 : "% Eax", "% ebx", "ecx", "cc"
			 );
	 printf ("(% d,% d,% d)", * odred, oldvalue, newvalue);
	 vratiti rezultat;
 }

 / * TODO
  * Pisati drugi ASM fxn koji stavlja iznad fxn u while petlji i držati težak, osim ako uspije * /

 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 ("mijenja vrijednost * 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, b));
	 printf ("% d \ n", cas (c, b, a));
	 return 0;
 }

Oblikovanje bilješke - izgleda kao WP isticanje sintakse je dodavanje na kraju, zanemariti činjenicu da.

Fact

 # Include 
 fact int (int a, int b) {
     int rezultat;
     / * Izračunaj najveći zajednički djelitelj pomoću Euclid 's Algoritmu * /
     __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;"
                           "Gotovo: movl%% eax,% 0;": "= g" (rezultat): "g" (), "g" (b)
     );

     vratiti rezultat;
 }

 int main () {
     int prvi, drugi;
     printf ("Unesite dva cijela broja:");
     scanf ("% d% d", i prvi, i drugi);

     printf ("fact of posto D &% d je% d \ n", prvi, drugi, fact (prvi, drugi));

     return 0;
 }