Litt av forsamlingen
Etter å ha lest denne artikkelen om lock gratis buffere og se bruken av CAS (sammenligne og bytte), følte jeg meg som legger forsamlingen koden for å gjøre det samme. Bruk tilfelle der borte var å skrive en innfødt metode og kalle det fra Java (tilbake i 1.5, da samtidige datastrukturer i Java var mer eller mindre ikke eksisterende). Uten videre, vil jeg utnytte koden til deg
. Først er for CAS og andre er for databehandling GCD bruke Euklids algoritme (denne kan finnes i mange steder og opplæring i tillegg).
Kompilere og kjøre instruksjoner gcc file_name.c ; ./a.out
Sammenlign og Bytt
# Include# Include / / Bytte - newvalue, er comperand gammel / forventet verdi / * * Funksjon gjør faktisk det følgende ting - hvis verdien på * dest er lik oldvalue deretter erstatte det med newvalue ellers la den uendret: å gjøre alle disse atomically * * Det er to alternativer for returverdi * 1.is initial verdi på * dest og la byrden av å kalle fxn å sammenligne den med oldval * 2. gjør det over her og returnere 0 eller 1, bør dette være mer effektiv ** / / * Senere endre den til makro * / 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 resultat = 1 ;/ * 1 viser at CAS lyktes og 0 viser at det sviktet * / / * Btw må sette cc for flagg 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" / * skal LOCK være på samme linje * / "JZ FERDIG \ n \ t" "Movl $ 0,% 1 \ n \ t" "FERDIG: \ n \ t" : "= M" (dest), "= g" (resultat) : "G" (oldvalue), "g" (newvalue), "M" (dest) : "% Eax", "% EBX", "ECx", "CC" ); printf ("(% d,% d,% d)", * dest, oldvalue, newvalue); returnere resultatet; } / * TODO * Skrive et annet asm fxn som setter ovenfor fxn på en stund løkke og fortsette å prøve med mindre det lykkes * / 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 ("endring verdi * c til% 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)); returnere 0; }
Formatering notater - virker som wp-syntaks highlighter er å legge til slutt, ignorere det.
GCD
# Includeint gcd (int a, int b) { int resultat; / * Beregn største felles divisor bruke Euklids algoritme * / __asm__ __ volatile__ ("movl% 1,%% EAX;" "Movl% 2,%% EBX;" "Forts: cmpl $ 0,%% EBX;" "Je gjort;" «Xorl%% EDX,%% EDX;" «Idivl%% EBX;" «Movl%% EBX,%% EAX;" «Movl%% EDX,%% EBX;" "JMP forts;" "FERDIG: movl%% eax,% 0;": "= g" (resultat): "g" (a), "g" (b) ); returnere resultatet; } int main () { int første, andre; printf ("Skriv to heltall:"); scanf ("% d% d", & første, og andre); printf ("GCD av% d &% d er% d \ n", første, andre, gcd (første, andre)); returnere 0; }



































