Litt av forsamlingen

29 august 2009 ved Prashant
Arkivert under: teknologi

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

 # Include 
 int 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;
 }

Kommentarer

    bloggkommentarer drevet av Disqus