Malo skupštine
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
# Includefact 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; }



































